class any { public: // [any.cons], construction and destruction constexpr any() noexcept; any(const any& other); any(any&& other) noexcept; template <class T> any(T&& value); template <class T, class... Args> explicit any(in_place_type_t<T>, Args&&...); template <class T, class U, class... Args> explicit any(in_place_type_t<T>, initializer_list<U>, Args&&...); ~any(); // [any.assign], assignments any& operator=(const any& rhs); any& operator=(any&& rhs) noexcept; template <class T> any& operator=(T&& rhs); // [any.modifiers], modifiers template <class T, class... Args> decay_t<T>& emplace(Args&& ...); template <class T, class U, class... Args> decay_t<T>& emplace(initializer_list<U>, Args&&...); void reset() noexcept; void swap(any& rhs) noexcept; // [any.observers], observers bool has_value() const noexcept; const type_info& type() const noexcept; };
Объект классаany хранит экземпляр любого типа, который удовлетворяет требованиям конструктора или не имеет значения, и это называется объектомstate классаany . Сохраненный экземпляр называется.contained valueДва состояния эквивалентны, если либо они оба не имеют значения, либо оба имеют значение, а содержащиеся значения эквивалентны.
Функции, не являющиеся членами,any_cast обеспечивают безопасный для типов доступ к содержащемуся значению.
Реализации должны избегать использования динамически выделяемой памяти для небольшого содержащегося значения. [ Example: где построенный объект содержит только файлint. ] Такая оптимизация малых объектов должна применяться только к типам, для которых есть . — end example T is_nothrow_move_constructible_v<T> true
constexpr any() noexcept;
any(const any& other);
Effects: Еслиother.has_value() естьfalse, создает объект, не имеющий значения. В противном случае эквивалентноany(in_place<T>, any_cast<const T&>(other)) гдеT - тип содержащегося объекта.
Throws: Любые исключения, возникающие при вызове выбранного конструктора для содержащегося значения.
any(any&& other) noexcept;
Effects: Еслиother.has_value() естьfalse, создает объект, не имеющий значения. В противном случае создает объект типа,any который содержит либо содержащийся объектother, либо содержит объект того же типа, созданный из содержащегося объекта,other рассматривая этот содержащийся объект как rvalue.
template<class T>
any(T&& value);
Effects: Создает объект типа,any который содержит объект типа,VT инициализированный напрямую с помощьюstd::forward<T>(value).
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если VT он не относится к тому же типу, что иany, VT не является специализациейin_place_type_tи неis_copy_constructible_v<VT> являетсяtrue.
template <class T, class... Args>
explicit any(in_place_type_t<T>, Args&&... args);
Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиstd::forward<Args>(args)....
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если is_copy_constructible_v<VT> неtrue и is_constructible_v<VT, Args...> являетсяtrue.
template <class T, class U, class... Args>
explicit any(in_place_type_t<T>, initializer_list<U> il, Args&&... args);
Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиil, std::forward<Args>(args)....
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если is_copy_constructible_v<VT> неtrue и is_constructible_v<VT, initializer_list<U>&, Args...> являетсяtrue.
~any();
any& operator=(const any& rhs);
any& operator=(any&& rhs) noexcept;
Postconditions: Состояние*this эквивалентно исходному состояниюrhs иrhs остается в допустимом, но в остальном не указанном состоянии.
template<class T>
any& operator=(T&& rhs);
Effects: Создает объектtmp типа,any который содержит объект типа,VT инициализированный напрямую с помощьюstd::forward<T>(rhs), иtmp.swap(*this). Никаких эффектов, если выбрасывается исключение.
Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если VT не является таким же типом , какany и is_copy_constructible_v<VT> естьtrue.
template <class T, class... Args>
decay_t<T>& emplace(Args&&... args);
Effects: Звонкиreset(). Затем инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиstd::forward<Args>(args)....
Remarks: Если во время вызоваVTконструктора возникает исключение , *this он не содержит значения и любое ранее содержащееся значение было уничтожено. Эта функция не будет участвовать в разрешении перегрузки , если is_copy_constructible_v<VT> неtrue и is_constructible_v<VT, Args...> являетсяtrue.
template <class T, class U, class... Args>
decay_t<T>& emplace(initializer_list<U> il, Args&&... args);
Effects: Звонкиreset(). Затем инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументами il, std::forward<Args>(args)....
Remarks: Если во время вызоваVTконструктора возникает исключение , *this он не содержит значения и любое ранее содержащееся значение было уничтожено. Функция не должна участвовать в разрешении перегрузки, за исключением случаев, когда is_copy_constructible_v<VT> естьtrue и is_constructible_v<VT, initializer_list<U>&, Args...> естьtrue.
void reset() noexcept;
void swap(any& rhs) noexcept;
bool has_value() const noexcept;
const type_info& type() const noexcept;