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

为何具名右值引用不会转为const左值引用?C++模板实例化疑问

关于模板函数参数推导的疑问解答

先看你的示例代码:

template<typename T>
void func(T&& t) {}

int main()
{
    int&& t = 5;
    func(t);
}

核心原因拆解:

  1. 具名右值引用的本质:虽然t的类型是int&&(右值引用类型),但一旦它有了名字,它的值类别就是左值——编译器会把它当成一个可寻址、可修改的左值看待。

  2. 模板转发引用的推导规则:模板里的T&&属于转发引用(universal reference),参数推导遵循以下规则:

    • 若传入的实参是左值(无论普通左值还是const左值),T会被推导为对应的左值引用类型;
    • 若传入的实参是右值,T会被推导为非引用类型。

    这里t是左值,所以T被推导为int&,再根据C++的引用折叠规则:int& &&会折叠成int&,最终函数签名就是void func<int&>(int&)。

  3. 为什么不会推导出const int&?
    变量t本身是非const的int&&类型,作为左值时它是可修改的。只有当实参本身是const左值,或者你显式指定模板参数为const int&时,才会得到const int&的版本。比如把t声明为const int&& t =5;,推导结果就会变成void func<const int&>(const int&)。

内容的提问来源于stack exchange,提问作者Erik Nouroyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:10:50