繁体   English   中英

启用默认初始化列表构造函数

[英]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; 到我的观点课,但那也没有用。 如何使用初始化列表初始化点?

您的原始案例依赖于聚合初始化[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];
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM