编译器错误 C3445

type”的复制列表初始化不能使用显式构造函数

根据 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 };
}