----已更新--------------------------------------------------------
起初,我认为我面临的问题是
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
?
如何制作这个结构
?trivially_copyable
我只需按照错误消息中的说明进行操作即可:
错误:使用已删除的函数“Message_t::Message_t()”
只需添加一个:
Message_t() : as_time{}, type{} {}