Amx*_*mxx 8 c++ inheritance initializer-list c++11 list-initialization
我相信现代C++初始化列表对于初始化对象非常有用,从而无需定义自己的构造函数:
struct point
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // nice !
Run Code Online (Sandbox Code Playgroud)
但是,当我的类继承自另一个类时,这不起作用:
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 :(
Run Code Online (Sandbox Code Playgroud)
我尝试添加point() = default;到我的点类,但这也不起作用.如何使用初始化列表初始化点?
您的原始案例依赖于聚合初始化[dcl.init.list]:
类型T的对象或引用的列表初始化定义如下:
...
- 否则,如果T是聚合,则执行聚合初始化
从[dcl.init.aggr]开始,聚合和聚合初始化的重点是:
聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3) ).
当初始化程序列表初始化聚合时,如8.5.4中所述,初始化程序列表的元素将作为聚合成员的初始化程序,增加下标或成员顺序.每个成员都是从相应的initializer子句复制初始化的.
但是现在,因为point有一个基类(serializable<point>),point不再是聚合,不再支持聚合初始化.
解决方案是简单地提供这样的构造函数来初始化point:
struct point : public serializable<point>
{
template <typename... T>
point(T... ts)
: coord{ts...}
{ }
float coord[3];
};
Run Code Online (Sandbox Code Playgroud)