class P {
public:
explicit P( int a, int b, int c) {
std::cout<<"calling explicit constructor"<<"\n";
}
};
int main() {
P z {77,5,42}; // OK
P w = {77,5,42}; // ERROR due to explicit (no implicit type conversion allowed)
}
我认为{77,5,42}
具有隐式类型std::initialization_list<int>
。如果是这种情况不会导致构造变量z
失败?
答案 0 :(得分:3)
我认为
{77,5,42}
的隐含类型为std::initialization_list<int>
{77,5,42}
本身没有类型。如果您撰写auto x = {77, 5, 42}
,则x
的类型为initializer_list
。您的示例类型P
具有显式构造函数。实际上,这意味着你必须写:
P w = P{77, 5, 42}
或更好:
auto w = P{77, 5, 42}
如果是这种情况,导致变量
z
的构造失败的原因是什么?
构造不会失败,因为 显式初始化它:P x{a, b, c}
不执行任何类型的隐式转换,而只是使用统一初始化语法来调用(显式) P
的构造函数。
答案 1 :(得分:0)
编译器试图通过查找可与
匹配的构造函数来进行隐式转换= {77,5,42};
一部分。
但是,它找到的构造函数被标记为显式,因此它不能用于隐式转换。因此,您将收到错误。