启用默认初始值设定项列表构造函数
Enable default initializer list constructor
我相信现代C++初始化器列表对于初始化对象非常有用,可以消除定义自己的构造函数的需要:
struct point
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // nice !
然而,当我的类从另一个类继承时,这是不起作用的:
template<typename T>
class serializable
{
protected:
serializable() = default;
...
// other stuff
}
struct point : public serializable<point>
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // Doesn't work :(
我尝试将point() = default;
添加到我的point类中,但也没有成功。我如何仍然可以用初始化器列表初始化点?
您的原始案例依赖于聚合初始化[dcl.init.list]:
类型T的对象或引用的列表初始化定义如下:
--否则,如果T
是聚合,则执行聚合初始化
聚合和聚合初始化在哪里,从[dcl.init.agr],emphasis mine:
聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),无基类(第10条),无虚拟函数(10.3)。
当聚合由初始化器列表初始化时,如8.5.4所述,初始化器列表的元素以递增下标或成员顺序作为聚合成员的初始值设定项。每个成员是从相应的初始值设定项子句复制初始化的。
但现在,由于point
有一个基类(serializable<point>
),point
不再是聚合,也不再支持聚合初始化。
解决方案是简单地提供这样一个构造函数来初始化point
:
struct point : public serializable<point>
{
template <typename... T>
point(T... ts)
: coord{ts...}
{ }
float coord[3];
};
相关文章:
- 一对向量构造函数:初始值设定项列表与显式构造
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 构造函数/函数声明参数列表中的统一初始化
- 在初始化列表之外手动调用基类的构造函数
- 采用初始值设定项列表的构造函数
- 提供初始值设定项列表构造函数的有效方法
- C 标准中是否有任何计划来解决初始化器列表构造函数的不一致性
- 接受迭代器的初始值设定项列表构造函数
- STD :: MAP初始化列表构造函数
- 如何避免丢失自动生成的初始化列表构造函数
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- 初始化列表构造函数错误带有CRTP
- 启用默认初始值设定项列表构造函数
- 使用初始化列表构造函数时C++奇怪的行为
- 自定义列表类的初始值设定项列表构造函数
- 初始值设定项列表构造函数导致右值构造函数不明确
- 调用初始化列表构造函数的不同方式
- 为什么std::array不包含初始化列表构造函数
- C++ 为类模板提供初始值设定项列表构造函数
- 何时使用初始值设定项列表构造函数