C++17 之前的聚合初始化

Aggregate initialization pre-C++17

本文关键字:初始化 C++17      更新时间:2023-10-16

考虑以下由聚合组成的类层次结构:

struct Foo {
int k;
double d;
};
struct Bar : Foo {
int i;
};

现在,假设我想从 Foo 类型的对象初始化 Bar 类型的对象,为i提供额外的参数。(出于沉闷的原因,在这里讨论,在接受FoointBar中添加构造函数,或者以任何其他方式修改BarFoo的定义是毫无疑问的(。在 C++17 中,我将使用聚合初始化:

auto make(const Foo& f) {
return Bar{f, 42};
}

这在 C++14 中不可用。在 C++14 中,我还能做些什么来模仿所需的行为吗?我试图避免类似的事情

auto make(const Foo& f) {
Bar b;
b.k = f.k;
b.d = f.d;
b.i = 42;
return b; // or return Bar{f.k, f.d, 42};
}

我试图避免的事情是让make意识到Foo的内部 - 即 知道如何初始化Bar的额外成员是可以的make,但不希望初始化Foo常见的Bar成员。

auto make(const Foo& f) {
Bar b;
static_cast<Foo&>(b) = f;
b.i = 42;
return b;
}