对于某些模板参数T,T&是什么意思?

use*_*020 9 c++ templates reference type-traits c++11

例如

template<class T>
struct Ref
{
    using type = T&;
};
Run Code Online (Sandbox Code Playgroud)

是否Ref<T>::type与std::add_lvalue_reference<T>::type所有可能的模板参数相同?例如int,int&和int&&?

我刚刚阅读了源代码std::add_lvalue_reference<T>.确定它们是等价的.
如果是的话,我们可以通过简单的写作T&来节省一些空间.

Col*_*mbo 6

[meta.trans.ref]中的表53 - 定义add_lvalue_reference:

如果T命名对象或函数类型,则成员typedef类型应命名T&; 否则,如果T名称类型为"rvalue reference to T1",那么成员typedef类型应该命名T1&; 否则,类型应命名T.

现在回想一下参考折叠的规则:

如果类型模板参数(14.3.1)[...]表示类型TR是对类型的引用T,则尝试创建类型"对cv的 左值引用TR"会创建类型"左值引用T" [... ]

所以答案是肯定的:

  • 对于对象或函数,条件很容易满足.只是T&,没有涉及参考崩溃.

  • 对于右值引用,将创建对引用类型的左值引用T1.

  • 对于左值引用,将保留确切的引用类型.