【问题标题】:Aggregate initialization of a class that privately inherits an aggregate class in C++11在 C++11 中私有继承聚合类的类的聚合初始化
【发布时间】:2013-08-06 03:27:36
【问题描述】:

考虑以下代码:

struct base
{
    int x, y, z;
};

struct derived : private base
{
    using base::base;
};

int main(int argc, const char *argv[])
{
    base b{1, 2, 3}; // Allowed
    derived d{1, 2, 3}; // Not allowed
}

derived d{1, 2, 3}; 行使我的编译器 (Clang 3.3) 失败,并出现错误“没有匹配的构造函数用于初始化‘派生’”。为什么是这样?有没有办法通过聚合初始化来初始化derived

【问题讨论】:

    标签: c++ inheritance c++11 aggregate-initialization


    【解决方案1】:

    derived 有一个基类,所以它不是一个聚合(第 8.5.1/1 节:“聚合是一个数组或一个类(第 9 条),[...] 没有基类 [... ]")。

    由于不是聚合,所以不能用聚合初始化来初始化。

    最明显的解决方法可能是将ctor 添加到base,并让derived 的ctor 将参数传递给base

    struct base
    {
        int x, y, z;
    
        base(int x, int y, int z) : x(x), y(y), z(z) {}
    };
    
    struct derived : private base
    {
        derived(int a, int b, int c) : base(a, b, c) {}
    };
    
    int main(int argc, const char *argv[])
    {
        base b{1, 2, 3}; // Allowed
        derived d{1, 2, 3}; // Allowed
    }
    

    当然,如果您设置为 base 仍然是一个聚合,这将不起作用。

    编辑:对于已编辑的问题,我在这里看不到使用std::initializer_list 的方法——std::array 没有任何东西可以接受initializer_list

    【讨论】:

    • 啊,我现在感觉自己像个白痴。我猜唯一的解决方法是向derived 添加一个构造函数,它接受一个initializer_list 并用它构造base
    猜你喜欢
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2017-03-24
    • 2015-08-21
    相关资源
    最近更新 更多