【发布时间】:2020-07-28 13:14:45
【问题描述】:
考虑:
#include <variant>
#include <iostream>
int main()
{
double foo = 666.666;
std::variant<double, uint64_t> v = foo;
std::cout << std::get<uint64_t>(v) << std::endl;
return 0;
}
这会导致:
terminate called after throwing an instance of 'std::bad_variant_access'
what(): Unexpected index
Aborted (core dumped)
为什么?
我知道std::variant 将替代union。但是,如果这种基本的东西失败了,它有什么用呢?
【问题讨论】:
-
union从来都不适合双关语。读取与上次写入不同的联合成员始终是未定义行为。 -
您在变体中没有
uint64_t。为什么你希望它给你一个? -
您将其分配为双精度数并将其读取为整数。你期待什么?与工会一起执行此操作会进入 UB 领域,因此获得例外会非常好。
-
-
"但是如果这种基本的东西失败了,它有什么用呢?"我认为这是基本成功的一个很好的例子:-)
标签: c++ c++17 ubuntu-18.04 variant gcc7