2017-02-22 7 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)woulすべて "int &"となります。しかし、実行結果は、私はしばらくの間、両方の(X + 1)各decltypeは、参照を取得するが、唯一の第1の作品だとして実行結果(1)を与える1,2,3されるべきであることが期待

1 
1 
1 

ましたintではなく 'int &'です。 なぜ、(x)と(x + 1)が異なるid-expression型ですか?

+0

私が標準を正しく理解していれば、 'x'は* id-expression *ですが、'(x) 'はそうではありません。 –

+0

[\ [expr.prim.lambda \]](http://eel.is/c++draft/expr.prim.lambda##20) 'declutype((x))'が出現するたびに 'x'が自動記憶域期間の名前エンティティ が 'X'がodr-た場合に宣言されていた閉鎖型の対応するデータ メンバへのアクセス中に形質転換したX ' 'かのように扱われる可能性が括弧ID-発現表示されたエンティティの使用。 – 0x499602D2

+0

@ 0x499602D2このスニペットのクロージャータイプはどこですか? –

答えて

5

x + 1はprvalueあるので、そのdecltypeはちょうどintです。対照的に、xはid式であるため、(x)は左辺値であり、その宣言型はint&です。 (ID-式自体(例えばx)のdecltypeは、変数が宣言されたように、実際の型であり、あなたは、式の値カテゴリで取得するために式を括弧ために持っていることで。特別なルールがあります)

関連する問題