gpt4 book ai didi

c++ - C++11中私有(private)继承聚合类的类的聚合初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:26:54 25 4
gpt4 key购买 nike

考虑以下代码:

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’”。为什么是这样?有什么方法可以通过聚合初始化来初始化 derived 吗?

最佳答案

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

因为不是聚合,所以不能用聚合初始化来初始化。

最明显的解决方法可能是向 base 添加一个 ctor,并让 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

关于c++ - C++11中私有(private)继承聚合类的类的聚合初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18071359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com