次の方法で共有


コンパイラ エラー C3445

'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 };
}