(回答によって促されます。)
N3290、§7.1.6.2p4を考えると、リストアイテムには番号が付けられていませんが、便宜上、ここでは番号が付けられています。
decltype(e)で示されるタイプは、次のように定義されます。
- eが括弧で囲まれていないid式または括弧で囲まれていないクラスメンバーアクセス(5.2.5)の場合、decltype(e)はeで指定されたエンティティのタイプです。そのようなエンティティがない場合、またはeがオーバーロードされた関数のセットに名前を付けている場合、プログラムの形式は正しくありません。
- それ以外の場合、eがxvalueの場合、decltype(e)はT &&です。ここで、Tはeのタイプです。
- それ以外の場合、eが左辺値の場合、decltype(e)はT&です。ここで、Tはeのタイプです。
- それ以外の場合、decltype(e)はeのタイプです。
decltype(0 + 0)で指定されたタイプは何ですか?
項目1は適用されず、2は適用される可能性がありますが、そうでない場合、3は適用されず、4が結果になります。では、xvalueとは何ですか、そして0 + 0はxvalueですか?
§3.10p1:
xvalue(「eXpiring」値)も、通常はその存続期間の終わり近くにあるオブジェクトを参照します(たとえば、そのリソースを移動できるようにするため)。xvalueは、右辺値参照(8.3.2)を含む特定の種類の式の結果です。
§8.3.2にはここで役立つものは何もありませんが、「0+0」には右辺値参照が含まれていないことは知っています。リテラル0は、「xvalueではない右辺値」(§3.10p1)であるprvalueです。「0+0」も優先値だと思います。それが本当なら、「decltype(0 + 0)」はintになります(int &&ではありません)。
私は私の解釈で何かを逃したことがありますか?このコードは整形式ですか?
decltype(0 + 0) x; // Not initialized.
このコードは、GCC 4.7.020110427およびClang2.9(トランク126116)でコンパイルされます。たとえば、decltypeがint &&型を指定した場合、整形式ではありません。