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; };
联合体可以在初始化列表中初始化吗?如果可以,怎么初始化?如果不能,为什么?
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; };
还要注意,我使用了{...}语法作为初始化器,而不是(...)“旧样式”,并且我使用了一个与联合成员不同的参数名。
{...}
(...)
1条答案
按热度按时间zqdjd7g91#
如果你有一个符合C++20标准(或更高版本)的编译器,那么你可以使用“初始化器列表”中指定的初始化器,来初始化(并因此激活)联合体的 * 任一个 * 成员,如下所示:
然而,在C20之前,指定初始化式不是C的一部分(尽管它们已经成为C的一部分有一段时间了);在这种情况下,你只能初始化联合体的第一个成员:
还要注意,我使用了
{...}
语法作为初始化器,而不是(...)
“旧样式”,并且我使用了一个与联合成员不同的参数名。