使用std :: initializer_list显式构造函数和初始化

时间:2015-05-09 16:38:36

标签: c++ c++11

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失败?

2 个答案:

答案 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};

一部分。

但是,它找到的构造函数被标记为显式,因此它不能用于隐式转换。因此,您将收到错误。

这可能是有意义的:What does the explicit keyword mean in C++?