Partager via


Erreur du compilateur C3445

l’initialisation de copie de liste de 'type' ne peut pas utiliser un constructeur explicite

Selon la norme ISO C++17, le compilateur est tenu de prendre en compte un constructeur explicite pour la résolution de surcharge dans l’initialisation de la liste de copie, mais doit déclencher une erreur si cette surcharge est réellement choisie.

À compter de Visual Studio 2017, le compilateur recherche des erreurs liées à la création d’objets à l’aide d’une liste d’initialiseurs introuvable par Visual Studio 2015. Ces erreurs peuvent entraîner des blocages ou un comportement non défini lors de l’exécution.

Exemple

L’exemple suivant génère l’erreur 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
}

Pour corriger l’erreur, utilisez plutôt l’initialisation directe :

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

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