web-dev-qa-db-ja.com

C ++標準で二重ブレーススカラーの初期化は許可されていますか?

私は次のコードを持っています:

int x = {{}};

この構文はC++標準に従って有効ですか? (C++ 11以降に興味があります。)

最新のコンパイラを使用する場合、問題はありませんが、一部の古いコンパイラ(GCC 4.8.5など)では次のエラーが発生します。

エラー:タイプ 'int'のスカラー初期化子を中括弧で囲みます

34
Igor

これは不正な形式です。 gccはそれを受け入れるのが間違っており、clangは 警告 のように、拡張として許可しているようです。

最新のドラフトを引用しますが、違いはありません。リストの初期化は [dcl.init.list] に従って次のように機能します。ここで、Tはintです。

  • 初期化子リストが指定された初期化子リストの場合、[...] =>そうではありません
  • Tが集合クラスの場合[...] =>それはそうではありません
  • Tが文字配列[...] =>ではない場合。
  • Tが集約[...] =>でない場合(配列とクラスのみが集約可能)
  • 初期化子リストに要素がない場合[...] =>ありません
  • Tがstd :: initializer_list [...] =>の特殊化である場合、そうではありません
  • Tがクラス型の場合[...] =>それはそうではありません
  • Tが固定の基になる型の列挙である場合[...] =>それはそうではありません
  • イニシャライザリストにタイプEの単一要素がある場合[...] =>ブレースされたイニシャライザリストにはタイプがないため、
  • Tが参照型の場合[...] =>そうではありません
  • 初期化子リストに要素がない場合[...] =>ありません
  • それ以外の場合、プログラムは不正な形式です
35
Rakete1111