均一な初期化構文を使用した初期化子リストを使用したクラス内メンバーの初期化?[重複]

StackOverflow https://stackoverflow.com//questions/24035388

質問

私はMSVC2013で以下をコンパイルしようとしています:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
}

コンパイラは私に次のエラーを与えます: SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.

私はこれにコードを変更した場合:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{{false, false, false}};
}

プログラムはコンパイルされ、正常に実行されます。これはコンパイラの問題ですか、それとも構文を理解していませんか?私が読んできたことから、最初のバージョンはコンパイルする必要があります。

役に立ちましたか?

解決

ここにn3797からの責任ある文法があります:

// after a member declaration:
braced-or-equal-initializer-list:
  = initializer-clause
  braced-init-list

braced-init-list:
  { initializer-list ,OPT }
  { }

initializer-list:
  initializer-clause
  initializer-list, initializer-clause

initializer-clause:
  assignment-expression
  braced-init-list

だから私は最初の声明が正しいと言うだろうし、それは確かに受け入れられている 最近の gccclang.

他のヒント

必要に応じてセミコロンを配置する場合

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
};

それからそれはMS VC++2013コンパイラのバグのようです。少なくともコードは次の場所で正常にコンパイルされますwww.ideone.com...

Structire SomeStructは集合体であり、初期化子リストを使用して初期化する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top