namespace std {
template<class... Types>
class variant {
public:
// [variant.ctor], constructors
constexpr variant() noexcept(see below);
variant(const variant&);
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&&...);
// [variant.dtor], destructor
~variant();
// [variant.assign], assignment
variant& operator=(const variant&);
variant& operator=(variant&&) noexcept(see below);
template<class T> variant& operator=(T&&) noexcept(see below);
// [variant.mod], modifiers
template<class T, class... Args>
T& emplace(Args&&...);
template<class T, class U, class... Args>
T& emplace(initializer_list<U>, Args&&...);
template<size_t I, class... Args>
variant_alternative_t<I, variant<Types...>>& emplace(Args&&...);
template<size_t I, class U, class... Args>
variant_alternative_t<I, variant<Types...>>& emplace(initializer_list<U>, Args&&...);
// [variant.status], value status
constexpr bool valueless_by_exception() const noexcept;
constexpr size_t index() const noexcept;
// [variant.swap], swap
void swap(variant&) noexcept(see below);
};
}constexpr variant() noexcept(see below);
variant(const variant& w);
variant(variant&& w) noexcept(see below);
template<class T> constexpr variant(T&& t) noexcept(see below);
template<class T, class... Args> constexpr explicit variant(in_place_type_t<T>, Args&&... args);
template<class T, class U, class... Args>
constexpr explicit variant(in_place_type_t<T>, initializer_list<U> il, Args&&... args);
template<size_t I, class... Args> constexpr explicit variant(in_place_index_t<I>, Args&&... args);
template<size_t I, class U, class... Args>
constexpr explicit variant(in_place_index_t<I>, initializer_list<U> il, Args&&... args);
variant& operator=(const variant& rhs);
variant& operator=(variant&& rhs) noexcept(see below);
template<class T> variant& operator=(T&& t) noexcept(see below);
is_nothrow_assignable_v<T&, T> && is_nothrow_constructible_v<T, T>
template<class T, class... Args> T& emplace(Args&&... args);
template<class T, class U, class... Args> T& emplace(initializer_list<U> il, Args&&... args);
template<size_t I, class... Args>
variant_alternative_t<I, variant<Types...>>& emplace(Args&&... args);
template<size_t I, class U, class... Args>
variant_alternative_t<I, variant<Types...>>& emplace(initializer_list<U> il, Args&&... args);
constexpr bool valueless_by_exception() const noexcept;
struct S { operator int() { throw 42; }};
variant<float, int> v{12.f};
v.emplace<1>(S());constexpr size_t index() const noexcept;
void swap(variant& rhs) noexcept(see below);