C++17 之前的聚合初始化
Aggregate initialization pre-C++17
考虑以下由聚合组成的类层次结构:
struct Foo {
int k;
double d;
};
struct Bar : Foo {
int i;
};
现在,假设我想从 Foo 类型的对象初始化 Bar 类型的对象,为i
提供额外的参数。(出于沉闷的原因,在这里讨论,在接受Foo
和int
的Bar
中添加构造函数,或者以任何其他方式修改Bar
或Foo
的定义是毫无疑问的(。在 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;
}
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么这种直接初始化有效?(C++17)
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- C++17,初始化一个数组
- 在 C++17 中初始化后可以更改行列变量吗?
- 你能初始化unique_ptrs "static const vectors"吗?(C++17 与 GCC 7.3)
- C++17 之前的聚合初始化
- 聚合初始化的 C++17 扩展是否使大括号初始化变得危险?
- C++17 几乎一致的初始化
- C 中副本初始化要求的放松17
- C++17 用于初始化模板类的折叠表达式的极限类型
- 可以在C 17中汇总初始化
- 我是否应该担心C 17中的Wmissing-Field-Initializer和汇总初始化
- c++17 聚合初始化
- 在C++17中使用空列表初始化构造函数时发生编译错误