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

Explicit constructor and initialization with std::initializer_list

本文关键字:构造函数 初始化 std initializer list      更新时间:2023-10-16
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的构建失败?

我认为{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};

部分。

但是,它找到的构造函数是明确标记的,因此不能用于隐式转换。因此,您会遇到一个错误。

这可能是感兴趣的:明确的关键字在C 中是什么意思?