不可初始化基类的聚合初始化

时间:2020-05-18 06:27:33

标签: c++ c++17 aggregate-initialization noncopyable

我正在从不可复制的基类构造派生类。我想在初始化器中聚合Base

// for convenience, could be any other way to disable copy
#include<boost/noncopyable.hpp>
struct Base: public boost::noncopyable{
    int a;
};
struct Derived: public Base{
    Derived(int a): Base{a} {}
};

但是我得到了:

error: could not convert ‘a’ from ‘int’ to ‘boost::noncopyable_::noncopyable’

据我了解,noncopyable无法初始化,这很公平。然后,我可以以某种方式设计聚合初始化程序,从而跳过不可复制的初始化吗? (例如,我在没有真正理解的情况下尝试了类似Base{{},a}之类的操作,但这也没有用:~noncopyable受保护了。)

还是我需要显式定义Base::Base来跳过noncopyable初始化,而是使用Derived::Derived中的初始化而不是聚合初始化?

1 个答案:

答案 0 :(得分:0)

您尝试过的基类的聚合初始化

Derived(int a): Base{{}, a} {}
//                   ^^ 

如果boost::noncopyable的构造函数不是protected(请参阅here),则将起作用。

最简单的解决方法应该是向基类添加一个构造函数。

#include <boost/core/noncopyable.hpp>

struct Base: private boost::noncopyable
{
    int a;
    Base(int a_) : a{a_} {}
};

struct Derived: public Base
{
    Derived(int a): Base{a} {}
};