带有匿名联合的 C++ 结构体

问题描述 投票:0回答:1

----已更新--------------------------------------------------------

起初,我认为我面临的问题是

trivially_copyable
。事实上,即使我放弃制作它
trivially_copyable
,它仍然可以NOT被编译。

现在,我只是想让它通过编译。

---- 原问题---------------------------------

我有一个结构体,将通过某种类型的消息队列在进程之间发送/接收,所以我想使其固定长度,以及

standard_layout
trivially_copyable

我的消息有多种类型(例如定时器消息、控制消息、订单消息等),那么我尝试使用

union
来承载不同类型的消息。

我不想使用

std::variant
的原因是我想精确控制消息结构的长度和布局。

此外,当我引用其成员时,我不想编写太长的代码。例如:

msg.as_time
msg.union_body.as_time
更具可读性。 所以我打算用匿名联合来承载消息体。

我期待着这个(但被海湾合作委员会拒绝了):

#include <chrono>

using TimeStamp_t = std::chrono::system_clock::time_point;

enum MsgType_e { Timer, Count, };

struct Message_t {
    union {
        TimeStamp_t as_time;
        int64_t     as_int;
    };

    MsgType_e  type;
};

static_assert( std::is_standard_layout_v<Message_t> );
static_assert( std::is_trivially_copyable_v<Message_t> );

int main() {
    Message_t msg;
    std::cout << msg.as_time.time_since_epoch().count();
}

尽管

MsgType_e
TimeStamp_t
都是
trivially_copyable
,但
Message_t
NOT,只要我将
TimeStamp_t
放入匿名联合体即可。

错误:使用已删除的函数“Message_t::Message_t()”

注意:“Message_t::Message_t()”被隐式删除,因为默认定义格式不正确:

联合成员 'Message_t::::as_time' 具有非平凡的 'constexpr std::chrono::time_point<_Clock, _Dur>::time_point() [with _Clock = std::chrono::_V2::system_clock; _Dur = std::chrono::duration >]'

如何制作这个结构

trivially_copyable

c++ variant standard-layout trivially-copyable anonymous-union
1个回答
0
投票

如何制作这个结构

trivially_copyable

我只需按照错误消息中的说明进行操作即可:

错误:使用已删除的函数“Message_t::Message_t()”

只需添加一个:

Message_t() : as_time{}, type{} {}

在这里工作。

© www.soinside.com 2019 - 2024. All rights reserved.