You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在初始化列表中初始化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,提问作者冷酷的倭瓜

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:56:34