2017-10-06 10 views
0
int i = 12; 

decltype(i) x4; // type is int 

decltype((i)) x5; // type is int& 

iはすでにlvaueです。 now decltype(i)は、式iのタイプと同じです。これは、具体的にはintです。 今やspec/standardによると、(i)は左辺値であり、decltype((i))は何らかの形で式(i)の左辺値を検査し、左辺値でもあるiと同じでなければなりません。しかし、なぜ標準が突然T&タイプが必要ですか?C++ 11:TとTの宣言型の振る舞い[両者の振る舞いの違い]

これは非常に混乱しています。もしそれがdecltype((i)&)だったら私はこれがdecltypeint&のはるかに明確で正確であったことに同意します。私はここで少し失われているのですが、i(i)のどちらも左辺型に解決され、TT&の異なる型が返されます。

+0

がリンクされ、重複は、あなたの質問に答えるホープ(&(i)(i)++ので(i)が左辺値である有効な式です)。また、[こちら](https://www.reddit.com/r/cpp/comments/4z8han/decltypee_decltypee/)の別のディスカッションもあります。 – songyuanyao

答えて

1

参考:すべてのdecltype specifier

まず、decltypeエンティティ表現で異なる動作をします。

1)引数が構造的結合を命名unparenthesized ID式である場合、decltype()は構造的結合宣言の明細書に記載され参照される型を生じます。 (以降C++ 17)

2)引数はunparenthesized ID-発現またはunparenthesizedクラスメンバアクセス式である場合、decltypeは、この式によって指定されたエンティティのタイプをもたらします。そのようなエンティティが存在しない場合、または引数がオーバーロードされた関数のセットに名前を付ける場合、プログラムは不正です。

引数は、型Tの任意の他の発現がある場合3)、及び - 式の値のカテゴリははxValueである場合、A)、次いでdecltypeはT & &得られます。 - b)expressionの値カテゴリがlvalueの場合、decltypeはT &を生成します。それが処理され、オブジェクトの名前を括弧された場合こと

注: - 式の値カテゴリがprvalueある場合、C)、次いでdecltypeはT.

、以下の行をもたらします通常の左辺値式として、decltype(x)decltype((x))は異なるタイプです。

だから規則2によれば、iエンティティので、decltypeはintある、iの正確な型を生じます。ルール3と特別に派生した行(上記)によれば、(i)は実体ではなく左辺の表現であるため、declatypeは左辺参照、つまりint&を生成します。