首页 > 解决方案 > 指定初始化器

问题描述

显然,指定的初始化器不是“正确的”C++。有没有其他选择?

我喜欢将它用于结构,因为:

谢谢耶勒

标签: c++struct

解决方案


给定

struct S {
    int x, y, z;
}:

S s {
    .y = 1; // not standard until C++20
};

有没有其他选择?

您可以使用位置列表初始化:

S s{0, 1};

它有一个缺点(可以说是一个好处,取决于情况)成员名称不明确,这意味着取决于成员的顺序,并且最后一个显式初始化之前的所有成员也必须在那里。

另一种选择:稍后分配成员。

S s{};
s.y = 1;

这有一个缺点,它不能用于初始化 const 成员。另一个缺点是这不是一个单一的初始化表达式。这可以通过使用一个函数来解决:

S init(int y) {
    S s{};
    s.y = y;
    return s;
}
S s = init(1);

还有另一种选择:使用构造函数。

struct S {
    int x = 0, y = 0, z = 0;
    S(int y): y(y) {}
};

这在某些情况下可能要简单得多,但在其他情况下则完全不明确(例如这种类似向量的情况)。另一个缺点是缺少简单的构造函数。


推荐阅读