2015-01-04 78 views
4
int main(){ 
    decltype(auto)&& a = 100; 
} 

上面的代码,在GCC和Clang中有错误。为什么不能参考'decltype(auto)'

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

此代码正确。

在N4296,

在§8.3.2/6

如果一个typedef(7.1.3),一种类型的模板的参数(14.3.1)或decltype说明符(7.1.6.2)表示一种类型的TR 那就是类型T的引用,企图制造“左值参考CV TR”的类型创建类型 “左值参照T”,而试图创建的类型“右值参考cv TR”创建类型TR。

在§7.1.6.2

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

我认为§8.3。 2/6是措辞有问题。

为什么不允许参考decltype(自动)。 请告诉我相关的标准措辞。 对不起的英文不好。 谢谢。

回答

3

在§7.1.6.4 [dcl.spec.auto]

如果占位符是decltype(自动)类型说明符,声明的 类型的变量或返回类型的函数的应独处的 占位符。为变量或返回类型推导出的类型为 ,如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) 
+0

谢谢。 §8.3.2/ 6混淆。 – Cocoa 2015-01-04 14:59:33

+0

我同意,7.1.6.4清除了。 – quantdev 2015-01-04 15:09:00