C++:不能在扩展 structs/classes 上使用指定的初始值设定项

C++: Cannot use designated initializers on extended structs/classes

我正在尝试找出一种方法来使用指定的初始值设定项来构建一个结构,该结构已从另一个结构扩展而来。在我的用例中,结构 S 是一个域对象,结构 S2 添加了一些特定于应用程序的逻辑来转换它 to/from json。据我所知,如果你有一个“真正的”构造函数,你就不能使用指定的初始化器,但如果你有一个静态方法为你返回一个新实例,一切都很好。

我有一个像这样的 MVP (view in Godbolt):

#include <iostream>

struct S {
    int i;
};

struct S2 : public S {
    static S2 create() {
        return S2 { .i = 1234 };
    }
};

int main() {
    std::cout << S2::create().i;
}

构建时(使用 -std=c++20),出现以下错误:

<source>:9:31: error: 'S2' has no non-static data member named 'i'
    9 |         return S2 { .i = 1234 };
      |                               ^

我希望 i 字段会被继承并初始化,但事实并非如此。

我正在尝试做一些 C++ 不支持的事情吗?

iS 的数据成员,但不是 S2

您可以添加另一个大括号来引用基础子对象,例如

return S2 { {.i = 1234} };

或者你可以利用大括号省略:

return S2 { 1234 };