(現在不使用) メンバー初期化子のリストまたは非静的データ メンバーの初期化子内のリストの初期化は実装されていません。
Visual Studio 2015 では、この警告は廃止されています。 Visual Studio 2013 以前のバージョンでは、Microsoft C++ コンパイラでは、メンバー初期化子リスト、または、非静的データ メンバーの初期化子のいずれの内部にも、リスト初期化を実装していません。 Visual Studio 2013 Update 3 より前は、これはサイレントに関数呼び出しに変換され、これにより、不適切なコードが生成される可能性がありました。 Visual Studio 2013 Update 3 ではこのことがエラーとして報告されます。
この例では、C2797 が生成されます。
#include <vector>
struct S {
S() : v1{1} {} // C2797, VS2013 RTM incorrectly calls 'vector(size_type)'
std::vector<int> v1;
std::vector<int> v2{1, 2}; // C2797, VS2013 RTM incorrectly calls 'vector(size_type, const int &)'
};
また、この例では C2797 も生成されます。
struct S1 {
int i;
};
struct S2 {
S2() : s1{0} {} // C2797, VS2013 RTM interprets as S2() : s1(0) {} causing C2664
S1 s1;
S1 s2{0}; // C2797, VS2013 RTM interprets as S1 s2 = S1(0); causing C2664
};
この問題を解決するには、内部リストの明示的な構築を使用できます。 次に例を示します。
#include <vector>
typedef std::vector<int> Vector;
struct S {
S() : v1(Vector{1}) {}
Vector v1;
Vector v2 = Vector{1, 2};
};
リストの初期化が必要ない場合:
struct S {
S() : s1("") {}
std::string s1;
std::string s2 = std::string("");
};
(Visual Studio 2013 Update 3 より前は、Visual Studio 2013 の コンパイラによって暗黙的にこのことが行われました。)