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&来节省一些空间.
[meta.trans.ref]中的表53 - 定义add_lvalue_reference:
如果
T命名对象或函数类型,则成员typedef类型应命名T&; 否则,如果T名称类型为"rvalue reference toT1",那么成员typedef类型应该命名T1&; 否则,类型应命名T.
现在回想一下参考折叠的规则:
如果类型模板参数(14.3.1)[...]表示类型
TR是对类型的引用T,则尝试创建类型"对cv的 左值引用TR"会创建类型"左值引用T" [... ]
所以答案是肯定的:
对于对象或函数,条件很容易满足.只是T&,没有涉及参考崩溃.
对于右值引用,将创建对引用类型的左值引用T1.
对于左值引用,将保留确切的引用类型.