例如
template<class T>
struct Ref
{
using type = T&;
};
对于所有可能的模板参数,Ref<T>::type
是否与std::add_lvalue_reference<T>::type
相同?例如。 int
,int&
和int&&
?
我刚刚阅读了std::add_lvalue_reference<T>
的源代码。确定它们是等价的。
如果它们是,我们可以通过简单地写T&
来节省一些空间。
答案 0 :(得分:6)
[meta.trans.ref]中的表53 - add_lvalue_reference
的定义:
如果
T
命名对象或函数类型,则为成员typedef类型 应命名为T&
;否则,如果T
命名一个类型“rvalue reference toT1
“然后成员typedef类型应命名为T1&
;否则,输入 应命名为T
。
现在回想一下参考折叠的规则:
如果[...]类型 template-parameter (14.3.1)[...]表示类型
TR
, 是对类型T
的引用,是尝试创建类型“左值” 对 cvTR
的引用“创建了对T
”的类型“左值引用” [...]
所以答案是肯定的:
对于对象或函数,条件很容易满足。它只是T&
,没有参与崩溃。
对于右值引用,将创建对所引用类型T1
的左值引用。
对于左值引用,将保留确切的引用类型。