T& T&对某些模板参数T意味着什么?

时间:2014-12-08 19:58:12

标签: c++ templates c++11 reference typetraits

例如

template<class T>
struct Ref
{
    using type = T&;
};

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

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

1 个答案:

答案 0 :(得分:6)

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

  

如果T命名对象或函数类型,则为成员typedef类型   应命名为T&;否则,如果T命名一个类型“rvalue reference to   T1“然后成员typedef类型应命名为T1&;否则,输入   应命名为T

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

  

如果[...]类型 template-parameter (14.3.1)[...]表示类型TR,   是对类型T的引用,是尝试创建类型“左值”   对 cv TR的引用“创建了对T”的类型“左值引用” [...]

所以答案是肯定的:

  • 对于对象或函数,条件很容易满足。它只是T&,没有参与崩溃。

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

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