为何具名右值引用不会转为const左值引用?C++模板实例化疑问
关于模板函数参数推导的疑问解答
先看你的示例代码:
template<typename T> void func(T&& t) {} int main() { int&& t = 5; func(t); }
核心原因拆解:
具名右值引用的本质:虽然
t的类型是int&&(右值引用类型),但一旦它有了名字,它的值类别就是左值——编译器会把它当成一个可寻址、可修改的左值看待。模板转发引用的推导规则:模板里的
T&&属于转发引用(universal reference),参数推导遵循以下规则:- 若传入的实参是左值(无论普通左值还是const左值),
T会被推导为对应的左值引用类型; - 若传入的实参是右值,
T会被推导为非引用类型。
这里
t是左值,所以T被推导为int&,再根据C++的引用折叠规则:int& &&会折叠成int&,最终函数签名就是void func<int&>(int&)。- 若传入的实参是左值(无论普通左值还是const左值),
为什么不会推导出
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
相关产品推荐
相关产品推荐

