Поделиться через


Ошибка компилятора C3445

Инициализация copy-list типа не может использовать явный конструктор

В соответствии со стандартом ISO C++17 компилятор должен рассмотреть явный конструктор для разрешения перегрузки в инициализации копирования списка, но должен вызвать ошибку, если эта перегрузка на самом деле выбрана.

Начиная с 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 };
}