使用std :: initializer_list显式构造函数和初始化
问题描述:
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
的失败?使用std :: initializer_list显式构造函数和初始化
答
我认为
{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
的(明确的)构造函数。
答
编译器正试图通过寻找一个构造函数,可以匹配
= {77,5,42};
部分做隐式转换。
但是,它发现的构造函数被标记为显式,因此它不能用于隐式转换。因此你会得到一个错误。
'{77,5,42}'没有类型。 –
谢谢,澄清。 – mavam