[variant.variant.general] (original) (raw)
22 General utilities library [utilities]
22.6 Variants [variant]
22.6.3 Class template variant [variant.variant]
22.6.3.1 General [variant.variant.general]
namespace std { template<class... Types> class variant { public: constexpr variant() noexcept(see below);constexpr variant(const variant&);constexpr variant(variant&&) noexcept(see below);template<class T> constexpr variant(T&&) noexcept(see below);template<class T, class... Args> constexpr explicit variant(in_place_type_t<T>, Args&&...);template<class T, class U, class... Args> constexpr explicit variant(in_place_type_t<T>, initializer_list<U>, Args&&...);template<size_t I, class... Args> constexpr explicit variant(in_place_index_t<I>, Args&&...);template<size_t I, class U, class... Args> constexpr explicit variant(in_place_index_t<I>, initializer_list<U>, Args&&...);constexpr ~variant();constexpr variant& operator=(const variant&);constexpr variant& operator=(variant&&) noexcept(see below);template<class T> constexpr variant& operator=(T&&) noexcept(see below);template<class T, class... Args> constexpr T& emplace(Args&&...);template<class T, class U, class... Args> constexpr T& emplace(initializer_list<U>, Args&&...);template<size_t I, class... Args> constexpr variant_alternative_t<I, variant<Types...>>& emplace(Args&&...);template<size_t I, class U, class... Args> constexpr variant_alternative_t<I, variant<Types...>>& emplace(initializer_list<U>, Args&&...);constexpr bool valueless_by_exception() const noexcept;constexpr size_t index() const noexcept;constexpr void swap(variant&) noexcept(see below);template<class Self, class Visitor> constexpr decltype(auto) visit(this Self&&, Visitor&&);template<class R, class Self, class Visitor> constexpr R visit(this Self&&, Visitor&&);};}
Any instance of variant at any given time either holds a value of one of its alternative types or holds no value.
When an instance of variant holds a value of alternative type T, it means that a value of type T, referred to as the variantobject's contained value, is nested within ([intro.object]) thevariant object.
A program that instantiates the definition of variant with no template arguments is ill-formed.
If a program declares an explicit or partial specialization of variant, the program is ill-formed, no diagnostic required.