均一な初期化構文を使用した初期化子リストを使用したクラス内メンバーの初期化?[重複]
質問
私は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
だから私は最初の声明が正しいと言うだろうし、それは確かに受け入れられている
最近の gcc
と clang
.
他のヒント
必要に応じてセミコロンを配置する場合
class SomeClass
{
struct SomeStruct { bool a,b,c; };
SomeStruct ss{false, false, false};
};
それからそれはMS VC++2013コンパイラのバグのようです。少なくともコードは次の場所で正常にコンパイルされますwww.ideone.com...
Structire SomeStructは集合体であり、初期化子リストを使用して初期化する必要があります。
所属していません StackOverflow