在聚合初始化期间无法访问继承的结构成员

Inherited struct members inaccessible during aggregate initialization

#include <vector>
#include <string>

struct BasePluginInfo
{
    bool bHasGui, bIsSynth;
    char cType;
    std::string sCategory, sSdkVersion, sVendor, sVersion;
};

struct PluginClassInfo
{
    std::string sName, sUid;
    std::vector<std::string> vsParamNames;
};

struct ShellPluginInfo : BasePluginInfo
{
    std::vector<PluginClassInfo> vciClasses;
};

当我做的时候

int main() {
    ShellPluginInfo
    {
        .bHasGui = true
    };
}

编译器抱怨 ShellPluginInfo has no field 'bHasGui'

然而这有效:

int main() {
    ShellPluginInfo info;
    info.bHasGui = true;
}

当用基数 classes 聚合初始化某些东西时,基数 class 就像 class 的成员一样,类似于如果你有:

struct ShellPluginInfo {
    BasePluginInfo __base_class_subobject;
    std::vector<PluginClassInfo> vciClasses;
};

因此,初始化列表中的第一个子句将尝试初始化它,您必须这样写:

ShellPluginInfo{  // This initializer list initializes a ShellPluginInfo
    { .bHasGui = true; }  // This initializer list initializes a BasePluginInfo
}

但是,由于这不是指定构造器,因此不能对派生 class 的其余成员使用指定构造器。例如:

ShellPluginInfo{
    {  // (note: doesn't have a designator)
        .bHasGui = true,
        .cType = 'a'  // OK
    },
    .vciClasses = {}  // ERROR: Can't mix designated and non-designated initializers

}

此提案试图补救:https://wg21.link/p2287r1,使您的原始尝试有效。虽然它还没有被接受,但你可能会在 C++23 中看到它。