编译器错误 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 };
}