type のオブジェクトを値初期化するT
には、次のいずれかの行に沿って何かを行います。
T x = T();
T x((T()));
私の質問は、単純な型指定子の組み合わせによって指定される型に関するものですunsigned int
。
unsigned int x = unsigned int();
unsigned int x((unsigned int()));
Visual C++ 2008 およびインテル C++ コンパイラー 11.1 は、これらの両方を警告なしで受け入れます。Comeau 4.3.10.1b2 と g++ 3.4.5 (確かに、特に最近ではありません) にはありません。
C++ 標準 (C++03 5.2.3/2、expr.type.conv) によると:
式は
T()
、T
非配列完全オブジェクト型または (おそらく cv 修飾された)void
型の単純型指定子 (7.1.5.2) であり、指定された型の右辺値を作成します。これは値で初期化されます。
unsigned
7.1.5.2 は、「単純な型指定子は次のとおりです」と述べ、とを含むリストが続きますint
。
したがって、5.2.3/2 では「simple-type-specifier」が単数でありunsigned
、int
2 つの型指定子であることを考えると、上記の使用例はunsigned int
無効ですか? (もしそうなら、フォローアップは、Microsoft と Intel が上記の表現をサポートするのは間違っていますか?)
この質問は、何よりも好奇心からのものです。複数の単純な型指定子の組み合わせによって指定されたすべての型について、値の初期化はゼロの初期化と同等です。(この質問は、この初期化に関する質問への回答に対するコメントによって促されました)。