CodeWalk

引用折叠(Reference Collapsing)的四种情况

作者:我是大山 · 2026-05-30 12:55

详细列出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++语法禁止显式声明。