为什么不能参考'decltype(auto)'

时间:2015-01-04 14:37:41

标签: c++ c++14 decltype

int main(){
    decltype(auto)&& a = 100;
}

以上代码,GCC和Clang中的错误。

int main(){
    decltype(int)&& a = 100;
}

此代码更正。

在N4296,

在§8.3.2/ 6中

  

如果typedef(7.1.3),类型模板参数(14.3.1)或decltype-specifier(7.1.6.2)表示类型TR   这是对类型T的引用,尝试创建类型“对cv TR的左值引用”会创建该类型   “左值引用T”,而尝试创建类型“rvue引用cv TR”会创建TR类型。

第7.1.6.2节中的

decltype-specifier

  

decltype说明符:
  decltype(表达)
  decltype(自动)

我认为§8.3.2/ 6 是措辞上的问题。

为什么不允许引用 decltype(auto)。 请告诉我相关标准的措辞。 抱歉英语不好。 谢谢。

1 个答案:

答案 0 :(得分:3)

在第7.1.6.4节[dcl.spec.auto]

  

如果占位符是decltype(auto)类型说明符,则声明   函数的变量或返回类型的类型应为   单独占位符。推导出的变量或返回类型的类型是   按照7.1.6.2中的描述确定,就像初始化程序一样   decltype的操作数。

所以这是允许的:

decltype(auto) a = 100;

但不是这样:

decltype(auto)& a = 100;

或者这个:

decltype(auto)&& a = 100;

这是有道理的,因为decltype(auto)背后的一个想法是在类型推导期间保留引用(即使用decltype类型推导,而不是模板/自动类型推导)


该标准为我们举例说明了decltype(auto)

推断引用的方式
int i;
int&& f();
auto x3a = i;                  // decltype(x3a) is int
decltype(auto) x3d = i;        // decltype(x3d) is int
auto x4a = (i);                // decltype(x4a) is int
decltype(auto) x4d = (i);      // decltype(x4d) is int&
auto x5a = f();                // decltype(x5a) is int
decltype(auto) x5d = f();      // decltype(x5d) is int&&
auto x6a = { 1, 2 };           // decltype(x6a) is std::initializer_list<int>
decltype(auto) x6d = { 1, 2 }; // error, { 1, 2 } is not an expression
auto *x7a = &i;                // decltype(x7a) is int*
decltype(auto)*x7d = &i;       // error, declared type is not plain decltype(auto)