C++模板引用转发行为异常:x与ref_x为何均被识别为左值引用?
问题解答
为什么传入x和ref_x时T都被识别为左值引用?
这是C++模板参数推导中转发引用(万能引用)的特性结合引用折叠规则导致的:
- 你的函数参数是
T&&且T是模板参数,属于转发引用。推导规则为:传入左值时,T会被推导为左值引用类型;传入右值时,T推导为非引用类型。 - 传入
x(int类型左值):T被推导为int&,函数参数变为int& &&,根据引用折叠规则,T& &&会折叠为T&,最终参数是int&。此时std::is_reference<T>::value为true,且是左值引用,所以输出对应提示。 - 传入
ref_x(int&类型左值):ref_x本身是左值引用类型的左值,推导时T同样被推导为int&,参数再次折叠为int&,因此T依然是左值引用类型,输出和传入x一致。
传入x和&x是否是相同的行为?
完全不同:
- 传入
x是传递int类型左值,T推导为int&,触发引用分支的左值引用逻辑; - 传入
&x是传递int*类型左值(指针本身是左值),此时T推导为int*&(左值引用类型),依然进入引用分支输出左值引用提示,但T的底层类型是指针的引用,和x对应的int引用本质不同。当前代码先判断引用类型,所以不会触发指针分支的逻辑。
内容的提问来源于stack exchange,提问作者Marco Morozzi
相关产品推荐
相关产品推荐

