2017-02-22 38 views
0

我在想,decltype((X))給予&引用類型,但一些實驗表明某事別人:C++ 11:decltype((x))和decltype((x + 1))的類型是不同的?

#include<stdio.h> 
int main(){ 
    int x = 0; 
    decltype((x)) r = x; 
    r = 1; 
    printf("%d\n",x); 

    decltype((x+1)) i = x; 
    i = 2; 
    printf("%d\n",x); 

    decltype((1)) k = x; 
    k = 3; 
    printf("%d\n",x); 
    return 0; 
} 

我期待的是(X)和(x + 1)和(1)竟被全部給出「int &」。但是運行結果是

1 
1 
1 

我預計隨着各decltype檢索參考,但似乎只是一號工程運行結果應該1,2,3,同時兼具(X + 1)(1)給出只有int,而不是'int &'。 爲什麼,(x)和(x + 1)是不同的id表達式類型?

+0

如果我正確理解標準,'x'是一個* id-表達式*,但'(x)'不是。 –

+0

[\ [expr.prim.lambda \]](http://eel.is/c++draft/expr.prim.lambda#20)每個出現的'decltype((x))'其中'x'是一個可能用括號表示的名稱爲自動存儲持續時間的實體 的id表達式被視爲「x」被轉換​​爲對相應數據的訪問 如果'x'是odr-使用表示的實體。 – 0x499602D2

+0

@ 0x499602D2這段代碼中的閉包類型在哪裏? –

回答

5

x + 1是一個prvalue,所以它的decltype只是int。相比之下,x是一個id表達式,因此(x)是一個左值,其decltype是int&。 (有一個特殊規則,id表達式本身的decltype(例如x)是聲明變量的實際類型,並且必須將表達式括起來以獲取表達式的值類別。)