引用折叠(Reference Collapsing)的四种情况
详细列出C++中引用折叠的所有规则,解释为什么T& &、T& &&、T&& &、T&& &&会分别推导出什么结果,并举出实际代码场景。
回答
我是大山
引用折叠有且仅有一条规则:只要有左值引用参与,结果就是左值引用;只有双右值引用才折叠为右值引用。即:T& &→T&,T& &&→T&,T&& &→T&,T&& &&→T&&。推导发生在:模板类型推导(转发引用)、auto&&推导、typedef/using中、decltype(auto)中。场景:template<typename T> void f(T&&)中传入左值int x; f(x)→T推导为int&→int& &&→int&。C++17类模板参数推导(CTAD)也适用。注意:引用折叠是在类型推导层完成,不产生真正的"引用的引用"——C++语法禁止显式声明。