在这个问题的answer中:
What is the equivalent of boost::variant in the C++ standard library?
提到boost::variant
和std::variant
有所不同。
std::variant
这些差异的动机是什么?(动机是在前C ++ 17代码中使用boost::variant
)
答案 0 :(得分:17)
作业/进驻行为:
boost::variant
可allocate memory when performing assignment进入直播variant
。有a number of rules that govern when this can happen,因此boost::variant
是否会分配内存取决于它实例化的Ts
。
std::variant
永远不会动态分配内存。但是,作为对C ++对象的复杂规则的让步,如果赋值/放置抛出,则variant
可能进入" valueless_by_exception"州。在此状态下,无法访问variant
,也无法访问特定成员的任何其他功能。
如果分配/安置投掷,您只能进入此状态。
Boost.Variant包含recursive_variant
,allows a variant
to contain itself。它们基本上是指向boost::variant
指针的特殊包装器,但它们与访问机器相关联。
std::variant
没有这样的帮助类型。
std::variant
提供了更多使用post-C ++ 11功能的功能。例如:
它转发其组成类型的特殊成员函数的noexcept
状态。
它具有基于模板的基于模板的就地构造函数和安置函数。
缺陷解决方案applied to C++17 may mean that it will also forward trivial copyability of its types。也就是说,如果所有类型都可以轻易复制,那么variant<Ts>
也是如此。
答案 1 :(得分:3)
似乎关于变体类设计的争论的主要观点是,当变量的赋值应该在完成时会破坏旧值时会发生异常:
variant<std::string, MyClassWithThrowingDefaultCtor> v = "ABC";
v = MyClassWithThrowingDefaultCtor();
选项似乎是:
boost::variant
显然是这样做。)如果我没弄错的话,后者就是被接受了。
这是由Axel Naumann于2015年11月从ISO C ++博客post总结的。
答案 2 :(得分:0)
std::variant 与 boost::variant 略有不同