-
Assignment/emplacement behavior:
-
boost::variant
may allocate memory when performing assignment into a livevariant
. There are a number of rules that govern when this can happen, so whether aboost::variant
will allocate memory depends on theTs
it is instantiated with. -
std::variant
will never dynamically allocate memory. However, as a concession to the complex rules of C++ objects, if an assignment/emplacement throws, then thevariant
may enter the “valueless_by_exception” state. In this state, thevariant
cannot be visited, nor will any of the other functions for accessing a specific member work.You can only enter this state if assignment/emplacement throws.
-
-
Boost.Variant includes
recursive_variant
, which allows avariant
to contain itself. They’re essentially special wrappers around a pointer to aboost::variant
, but they are tied into the visitation machinery.std::variant
has no such helper type. -
std::variant
offers more use of post-C++11 features. For example:-
It forwards the
noexcept
status of the special member functions of its constituent types. -
It has variadic template-based in-place constructors and emplacement functions.
-
Defect resolutions applied to C++17 may mean that it will also forward trivial copyability of its types. That is, if all of the types are trivially copyable, then so too will
variant<Ts>
.
-