Freigeben über


Compilerfehler C3445

Die copy-list-Initialisierung von „type“ darf keinen expliziten Konstruktor verwenden

Bemerkungen

Gemäß dem ISO C++17-Standard ist der Compiler erforderlich, um einen expliziten Konstruktor für die Überladungsauflösung in der Copy-List-Initialisierung in Betracht zu ziehen, muss jedoch einen Fehler auslösen, wenn diese Überladung tatsächlich ausgewählt wird.

Ab Visual Studio 2017 findet der Compiler Fehler im Zusammenhang mit der Objekterstellung mithilfe einer Initialisierungsliste, die von Visual Studio 2015 nicht gefunden wurde. Diese Fehler können zu Abstürzen oder nicht definierten Verhaltensweisen zur Laufzeit führen.

Beispiel

Im folgenden Beispiel wird C3445 generiert.

// 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
}

Verwenden Sie zum Beheben des Fehlers stattdessen die direkte Initialisierung:

// C3445b.cpp
struct A
{
    explicit A(int) {}
    A(double) {}
};

int main()
{
    A a1{ 1 };
}