我做了简单的测试,以了解更好的移动语义。输出结果对我来说意外。贝娄是我的测试功能:
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。 我的结论出了什么问题?
答案 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;)