能否在初始化列表中初始化union?若可以该如何?若不行原因是什么?
初始化列表里能不能初始化union类型?
先看你给出的示例代码:
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; };
答案是可以用初始化列表初始化union类型,但你代码里的写法是错的,下面说清楚原因和正确实现:
为什么原代码报错?
初始化列表里只能对对象整体做初始化操作,不能直接通过m_value.i(i)这种方式去初始化union的成员——union的成员只是同一块内存的不同解读方式,不是独立的可初始化对象,所以这种语法本身就不合法。而类里的m_value.i = i是赋值操作,是在union已经被默认构造之后修改成员值,这和初始化不是一回事,所以能正常编译。
正确的实现方式
有两种靠谱的写法,都支持C++11及以后的标准:
指定成员的统一初始化
用花括号明确指定要初始化的union成员,语法清晰:Json(int i): m_value{.i = i} {}利用union的默认初始化规则
如果要初始化的是union的第一个成员,可以直接用花括号传值,编译器会默认初始化第一个成员:Json(int i): m_value{i} {}要是想初始化其他成员,比如
j,也可以这么写:Json(bool b): m_value{.j = b} {}
内容的提问来源于stack exchange,提问作者冷酷的倭瓜
相关产品推荐
相关产品推荐

