2015-05-09 85 views
4
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显式构造函数和初始化

回答

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

'{77,5,42}'没有类型。 –

+0

谢谢,澄清。 – mavam

0

编译器正试图通过寻找一个构造函数,可以匹配

= {77,5,42}; 

部分做隐式转换。

但是,它发现的构造函数被标记为显式,因此它不能用于隐式转换。因此你会得到一个错误。

这可能会感兴趣:What does the explicit keyword mean in C++?