[expr.type.conv]
2 式は、非配列完全オブジェクト型または (おそらく cv 修飾された) 型のT()
単純型指定子または型名指定子であり、指定された型の prvalue を作成します。その値は value- によって生成されたものです。タイプのオブジェクトを初期化(8.5)します。ケースの初期化は行われません。[...]T
void
T
void()
NBvoid
はsimple-type-specifierです。
3 同様に、 braced -init-listが後に続くsimple-type-specifierまたはtypename-specifierは、指定された braced -init-listを使用して、指定された直接リスト初期化型 (8.5.4) の一時オブジェクトを作成し、そのvalue は、prvalue としてのその一時オブジェクトです。
一時オブジェクトは /3 で作成され、値は /2 で作成されることを指摘してくれたKeith Thompsonに感謝します。
[basic.types]/5 を見ると
不完全に定義されたオブジェクト型であり、そのvoid
型は不完全な型です (3.9.1)。オブジェクトは、不完全な型を持つように定義されてはなりません。
void{}
(一時的な)オブジェクトを作成するため、許可されていないことが明らかになりました。void()
ただし、「のみ」は (pr) 値を作成します。これら 2 つのケースの実装 (動作) に違いはないと思いますが、異なる言語ルールが適用されます。これらの規則の 1 つは、 type のオブジェクトの作成を禁止しているvoid
ため、エラーが発生します。
Ad decltype(void())
:decltype(e)
式を取りますe
。[dcl.type.simple]/4 では、適用可能な定義decltype(e)
は次のとおりです。
それ以外の場合decltype(e)
は、のタイプですe
( asvoid()
は prvalue を生成し、id-expressionではありません)。
したがって、decltype(void())
が得られvoid
ます。