用std :: initializer_list进行显式构造函数和初始化
Explicit constructor and initialization with 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
的构建失败?
我认为
{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 中是什么意思?
相关文章:
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 这是使用构造函数初始化数组对象的最佳方法吗?
- 内置类型的构造函数初始化
- 构造函数初始化和对象损坏