c++ 联合体可以在初始化列表中初始化吗?如果可以,怎么初始化?如果不能,为什么?

i5desfxk  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(246)
union value {
    int i;
    bool j;
};
class Json {
    public:
        Json(int i): m_value.i(i) {};//error
        m_value.i = i;  //correct
    private:
        value m_value;
};

联合体可以在初始化列表中初始化吗?如果可以,怎么初始化?如果不能,为什么?

zqdjd7g9

zqdjd7g91#

如果你有一个符合C++20标准(或更高版本)的编译器,那么你可以使用“初始化器列表”中指定的初始化器,来初始化(并因此激活)联合体的 * 任一个 * 成员,如下所示:

union value {
    int i;
    bool j;
};

class Json {
public:
    Json(int iarg) : m_value{ .i = iarg } { }
    Json(bool barg) : m_value{ .j = barg } { }
private:
    value m_value;
};

然而,在C20之前,指定初始化式不是C的一部分(尽管它们已经成为C的一部分有一段时间了);在这种情况下,你只能初始化联合体的第一个成员:

union value {
    int i;
    bool j;
};

class Json {
public:
    Json(int iarg) : m_value{ iarg } { } // Sets m_value.i to iarg
private:
    value m_value;
};

还要注意,我使用了{...}语法作为初始化器,而不是(...)“旧样式”,并且我使用了一个与联合成员不同的参数名。

相关问题