You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何右值参数在使用时会变为左值?

为什么用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:50:29