移动左值的语义

时间:2017-06-01 12:38:08

标签: c++ std move-semantics rvalue

我做了简单的测试,以了解更好的移动语义。输出结果对我来说意外。贝娄是我的测试功能:

template<class T>
void test(T&& v)
{
    v++;
}

void main()
{
    int v = 1;
    test(std::move(v));
    std::cout << "Output:" << v << std::endl;
}

我的期望是: 输出:1 但真正的结果是: 输出:2

我认为如下 - 我使用std :: move(v),结果我转换为&#34; rvalue&#34;和测试函数将使用时间变量。因此结果应为输出:1。 我的结论出了什么问题?

2 个答案:

答案 0 :(得分:0)

std::move永远不会构建一个临时的。它是对rvalue-reference的转换。

此引用绑定到main::v,然后test::v参数初始化,因此也绑定到main::v

如果要创建临时,请使用强制转换:

test(int{v});

答案 1 :(得分:0)

为了帮助您了解模板推断出的类型,您可以使用宏__PRETTY_FUNCTION__

template<class T>
void test(T&& v)
{
    std::cout<< __PRETTY_FUNCTION__ << std::endl;
    v++;
}

此外,这些人解释了很多关于模板演绎的事情(你的情况是在35&#39;)

https://www.youtube.com/watch?v=vwrXHznaYLA