Condividi tramite


Errore del compilatore C3445

l'inizializzazione copy-list di 'type' non può usare un costruttore esplicito

In base allo standard ISO C++17, il compilatore deve considerare un costruttore esplicito per la risoluzione dell'overload nell'inizializzazione copy-list, ma deve generare un errore se tale overload viene effettivamente scelto.

A partire da Visual Studio 2017, il compilatore rileva gli errori correlati alla creazione di oggetti usando un elenco di inizializzatori non trovati da Visual Studio 2015. Questi errori possono causare arresti anomali o comportamenti non definiti in fase di esecuzione.

Esempio

L'esempio seguente genera l'errore 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
}

Per correggere l'errore, usare invece l'inizializzazione diretta:

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

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