'type' のコピーリスト初期化では明示的なコンストラクターを使用できません
ISO C++17 標準によると、コンパイラは、copy-list-initialization で、オーバーロードの解決のために明示的なコンストラクターを考慮する必要がありますが、そのオーバーロードが実際に選択された場合にエラーを発生させる必要があります。
Visual Studio 2017 以降、コンパイラでは、初期化子リストを使用して、Visual Studio 2015 では検出されなかったオブジェクトの作成に関連するエラーを検出します。 これらのエラーにより、実行時にクラッシュや未定義の動作が発生する可能性があります。
例
次の例では C3445 が生成されます。
// C3445.cpp
struct A
{
explicit A(int) {}
A(double) {}
};
int main()
{
A a1 = { 1 }; // error C3445: copy-list-initialization of
// 'A' cannot use an explicit constructor
}
このエラーを修正するには、代わりに直接の初期化を使用します。
// C3445b.cpp
struct A
{
explicit A(int) {}
A(double) {}
};
int main()
{
A a1{ 1 };
}