Udostępnij za pomocą


Błąd kompilatora C3445

inicjalizacja typu copy-list nie może używać jawnego konstruktora

Uwagi

Zgodnie ze standardem ISO C++17 kompilator jest wymagany do rozważenia jawnego konstruktora do rozpoznawania przeciążenia w inicjowaniu kopii listy, ale musi zgłosić błąd, jeśli to przeciążenie jest rzeczywiście wybrane.

Począwszy od programu Visual Studio 2017, kompilator wyszukuje błędy związane z tworzeniem obiektów przy użyciu listy inicjatorów, które nie zostały odnalezione przez program Visual Studio 2015. Te błędy mogą prowadzić do awarii lub niezdefiniowanego zachowania w czasie wykonywania.

Przykład

Poniższy przykład generuje kod 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
}

Aby rozwiązać ten problem, użyj inicjowania bezpośredniego zamiast tego:

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

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