【发布时间】:2020-02-24 01:52:55
【问题描述】:
std::variant 是 union 的替代品。
但联合可以通过网络安全地在另一个平台(不同的编译器或架构)接收。 std::variant 可以这样做吗?
比如我有两台机器A和B。A是windows,MSVC 19.4。 B 是 Linux、gcc(或其他编译器,例如 MSVC 17)。 我在A(或B)下编译代码:
std::variant<int, double> v = 1; // holds int.
f.write(&v, sizeof(v));
B 可以使用同一文件中的以下代码读取正确的值吗?
std::variant<int, double> v;
f.read(&v, sizeof(v));
如果 std::variant 不能安全地通过网络。有没有图书馆提供?提升::变体?或者可能创建一个类似于 std::variant 的自定义实现?
【问题讨论】:
-
你甚至不应该像这样通过网络传递
int,更不用说std::variant了。使用序列化库或自行序列化。 -
实际上隐藏了一个很好的问题:仅包含 POD 的变体本身是否是 POD。重新阅读变体的(简短的)定义,它对这个主题保持沉默,所以我会说它是未指定的。
-
@SamVarshavchik 至少在 C++20 中是这样,不知道它是否被认为是针对 C++17 的缺陷报告。从p0602r4 更改结果。
-
@OP:如果
f是标准流,您的代码也无法编译。您需要明确地将reinterpret_cast到char*才能编译。
标签: c++ compatibility std-variant