2015-01-04 80 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