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

Ste*_*hen 5 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)

}
Run Code Online (Sandbox Code Playgroud)

我认为 {77,5,42}有隐式类型std::initialization_list<int>。如果是这种情况,是什么导致变量构造失败z

mav*_*vam 4

我认为{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}
Run Code Online (Sandbox Code Playgroud)

或更好:

auto w = P{77, 5, 42}
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,是什么导致变量构造失败z

构造不会失败,因为您显式初始化它:P x{a, b, c}不执行任何类型的隐式转换,而只是使用统一初始化语法来调用 的(显式)构造函数P