int()
とint{}
はに等しい値の定数式であるため、0
同等で交換可能であると考えたため、コンパイラはそれらを同等に扱わなければなりません。例えば、
int a[0]; //error: zero-sized array not allowed in ISO C++
int b[int()]; //error: zero-sized array not allowed in ISO C++
int c[int{}]; //error: zero-sized array not allowed in ISO C++
ただし、交換できないコーナーケースがいくつかあるようです。
ポインターを初期化する場合:
int *p = 0; //ok int *q = int(); //error - by clang only int *r = int{}; //error - by gcc and clang both
GCCおよびClangメッセージを参照してください。このコンテキストでは互換性があると思われるため、これは両方のコンパイラのバグであると思われますが、間違っていることが証明されれば幸いです。:-)
クラス テンプレートに渡す場合:
template<int N> struct X{}; X<0> x1; //ok X<int{}> x2; //ok (same as X<0>) X<int()> x3; //error
のような
X<int()>
同様の構文を以前に見た (そしておそらく使用した) ので、構文は非常によく 知られていstd::function<int()>
ます。しかし、このコンテキストで言う仕様のセクションを知りたいのは、関数型として扱われることであり、 which is always と同等ではありません。int()
0
int
int()
int{}
0