联合类型的数据成员的初始化

Initialization of a data member of union type

本文关键字:数据成员 初始化 类型      更新时间:2023-10-16

使用C 11:

编译以下代码
class CoolData {
public:
    typedef union {
        char char_t;
        int  int_t;
    } event_data_t;     
    CoolData() : _event_data(static_cast<event_data_t>(0)) {}
private:
    event_data_t _event_data;
};

int main() 
{
    return 0;
}

我收到以下汇编错误:

prog.cpp: In constructor 'CoolData::CoolData()': prog.cpp:8:54: error: no matching function for call to 'CoolData::event_data_t::event_data_t(int)'
CoolData() : _event_data(static_cast<event_data_t>(0)) {}
                                                      ^
prog.cpp:6:4: note: candidate: CoolData::event_data_t::event_data_t()   } event_data_t;  
                                                                   ^
prog.cpp:6:4: note:   candidate expects 0 arguments, 1 provided 
prog.cpp:6:4: note: candidate: constexpr CoolData::event_data_t::event_data_t(const CoolData::event_data_t&)
prog.cpp:6:4: note:   no known conversion for argument 1 from 'int' to 'const CoolData::event_data_t&'
prog.cpp:6:4: note: candidate: constexpr CoolData::event_data_t::event_data_t(CoolData::event_data_t&&)
prog.cpp:6:4: note:   no known conversion for argument 1 from 'int' to 'CoolData::event_data_t&&'

我只想在初始化列表中使用整数初始值初始化_event_data
我该怎么做?

您可以选择几种替代方案。
您可以做到这一点:

CoolData() { _event_data.int_t = 0; }

或以下:

class CoolData {
public:
    using event_data_t = union U {
        U() { int_t = 0; }
        char char_t;
        int  int_t;
    };
    CoolData() { }
private:
    event_data_t _event_data;
};

甚至以下:

class CoolData {
public:
    using event_data_t = union U {
        U(int v) { int_t = v; }
        char char_t;
        int  int_t;
    };
    CoolData(): _event_data{0} { }
private:
    event_data_t _event_data;
};

我怀疑最后一个是您要寻找的。