juz*_*lin 1 c++ variant c++17 gcc7 ubuntu-18.04
考虑:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这导致:
terminate called after throwing an instance of 'std::bad_variant_access'
what(): Unexpected index
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
为什么?
我知道这std::variant将是union. 但如果这种基本的东西失败了,它有什么好处呢?
我知道 std::variant 将替代 union。
是的。的种类。但是您的误解似乎与 C++ 中的联合有关。从cppreference:
从最近未写入的联合成员中读取是未定义的行为。许多编译器作为非标准语言扩展实现了读取联合的非活动成员的能力。
请注意,这与 C 不同,这是一个常见误解的根本原因,即在 C++ 中也允许访问非活动成员。
为什么?
因为std::variant模仿工会但增加了一些安全性并且std::get是......
基于索引的值访问器:如果 v.index() == I,则返回对存储在 v 中的值的引用。否则,抛出 std::bad_variant_access。如果 I 不是变体中的有效索引,则调用格式错误。
.
但如果这种基本的东西失败了,它有什么好处呢?
C++ 中的联合从来就不是这样使用的。当您想将两个或多个值压缩到同一内存中时(但在任何时候只使用其中一个),联合宁愿节省内存。我从来没有遇到过它们的真正用例。std::variant然而,是 C++ 类型的一个很好的补充。更大的图景是很久以来就已经存在所谓的产品类型,例如std::pair<T1,T2>,从某种意义上说,它们可以表示的值集是T1 x T2。有了std::variant(和std::any),现在 C++ 也有适当的(= 具有一定程度的类型安全性,这是你从未从联合中获得的)和类型,即 astd::variant<T1,T2>可以表示的值集是T1 + T2(抱歉使用草率符号,希望它很清楚)。
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |