为何右值参数在使用时会变为左值?
为什么用std::move传入后,testForward里调用了左值版本的print?
核心原因很简单:所有有名字的变量,不管它是左值引用还是右值引用,本身都是左值。
你用std::move(x)把x转换成右值,传给testForward(T&& v)时,v是一个绑定了右值的右值引用变量,但因为它有明确的名字v,编译器会把它当作左值看待。所以直接调用print(v)时,会匹配接受左值引用的print(T& t)版本,输出"Lvalue ref"。
如果想保留原始的右值属性,需要用std::forward进行完美转发,它会根据T的类型信息,把v还原成原来的右值类型。修改testForward函数如下:
template<typename T> void testForward(T&& v) { print(std::forward<T>(v)); // 此时会匹配右值版本的print }
修改后再运行代码,testForward(std::move(x))就会输出"Rvalue ref"了。
这里额外提一句:T&&在这里是万能引用(转发引用),它可以绑定左值或右值,但绑定后变量本身的左值属性不会改变,必须靠std::forward才能还原它的原始值类别。
内容的提问来源于stack exchange,提问作者GuangJun Liu
相关产品推荐
相关产品推荐

