Ответ 1
-
Поведение назначения/размещения:
-
boost::variant
может выделять память при выполнении присваивания в живомvariant
. Существует ряд правил, определяющих, когда это может произойти, поэтому вопрос о том, будет лиboost::variant
выделять память, зависит отTs
он создается. -
std::variant
никогда не будет динамически распределять память. Однако в качестве уступки сложным правилам объектов C++, если выбрасывает присваивание/размещение,variant
может войти в состояние "valueless_by_exception". В этом состоянииvariant
недоступен, и никакие другие функции для доступа к конкретному члену не будут работать.Вы можете войти в это состояние, только если броски с назначением/назначением.
-
-
Boost.Variant включает в себя
recursive_variant
, который позволяетvariant
содержать себя. По сути, они являются специальными обертками вокруг указателя наboost::variant
, но они связаны с механизмом посещения.std::variant
нет такого вспомогательного типа. -
std::variant
option предлагает более широкое использование пост-C++ 11 функций. Например:-
Он передает статус
noexcept
для специальных функций-членов своих составляющих типов. -
Он имеет вариационные шаблоны на основе шаблонов и функции размещения.
-
Разрешение дефектов, примененное к C++ 17, может означать, что оно также будет способствовать простому копированию его типов. То есть, если все типы тривиально копируемы, то так же будет
variant<Ts>
.
-