23 General utilities library [utilities]

23.8 Storage for any type [any]

23.8.3 Class any [any.class]

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 exampleT is_­nothrow_­move_­constructible_­v<T> true

23.8.3.1 Construction and destruction [any.cons]

constexpr any() noexcept;

Postconditions: has_­value() естьfalse.

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.

Postconditions: other остается в допустимом, но в остальном неуказанном состоянии.

template<class T> any(T&& value);

ПустьVT будетdecay_­t<T>.

Requires: VT должны удовлетворятьCopyConstructible требованиям.

Effects: Создает объект типа,any который содержит объект типа,VT инициализированный напрямую с помощьюstd​::​forward<T>(value).

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если VT он не относится к тому же типу, что иany, VT не является специализациейin_­place_­type_­tи неis_­copy_­constructible_­v<VT> являетсяtrue.

Throws: Любое исключение, созданное выбранным конструкторомVT.

template <class T, class... Args> explicit any(in_place_type_t<T>, Args&&... args);

ПустьVT будетdecay_­t<T>.

Requires:VT должны удовлетворятьCopyConstructible требованиям.

Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиstd​::​forward<Args>(args)....

Postconditions:*this содержит значение типаVT.

Throws: Любое исключение, созданное выбранным конструкторомVT.

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);

ПустьVT будетdecay_­t<T>.

Requires:VT должны удовлетворятьCopyConstructible требованиям.

Effects: Инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиil, std​::​forward<Args>(args)....

Postconditions:*this содержит значение.

Throws: Любое исключение, созданное выбранным конструкторомVT.

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки , если is_­copy_­constructible_­v<VT> неtrue и is_­constructible_­v<VT, initializer_­list<U>&, Args...> являетсяtrue.

~any();

Effects: Как будто мимоreset().

23.8.3.2 Assignment [any.assign]

any& operator=(const any& rhs);

Effects: Как будто мимоany(rhs).swap(*this). Никаких эффектов, если выбрасывается исключение.

Returns: *this.

Throws: Любые исключения, возникающие из конструктора копирования для содержащегося значения.

any& operator=(any&& rhs) noexcept;

Effects: Как будто мимоany(std​::​move(rhs)).swap(*this).

Returns: *this.

Postconditions: Состояние*this эквивалентно исходному состояниюrhs иrhs остается в допустимом, но в остальном не указанном состоянии.

template<class T> any& operator=(T&& rhs);

ПустьVT будетdecay_­t<T>.

Requires: VT должны удовлетворятьCopyConstructible требованиям.

Effects: Создает объектtmp типа,any который содержит объект типа,VT инициализированный напрямую с помощьюstd​::​forward<T>(rhs), иtmp.swap(*this). Никаких эффектов, если выбрасывается исключение.

Returns: *this.

Remarks: Этот оператор не должен участвовать в разрешении перегрузки , если VT не является таким же типом , какany и is_­copy_­constructible_­v<VT> естьtrue.

Throws: Любое исключение, созданное выбранным конструкторомVT.

23.8.3.3 Modifiers [any.modifiers]

template <class T, class... Args> decay_t<T>& emplace(Args&&... args);

ПустьVT будетdecay_­t<T>.

Requires: VT должны удовлетворятьCopyConstructible требованиям.

Effects: Звонкиreset(). Затем инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументамиstd​::​forward<Args>(args)....

Postconditions:*this содержит значение.

Returns: Ссылка на новое содержащееся значение.

Throws: Любое исключение, созданное выбранным конструкторомVT.

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);

ПустьVT будетdecay_­t<T>.

Requires: VT должны удовлетворятьCopyConstructible требованиям.

Effects: Звонкиreset(). Затем инициализирует содержащееся значение, как если бы инициализирует объект типа напрямую без использования спискаVT с аргументами il, std​::​forward<Args>(args)....

Postconditions:*this содержит значение.

Returns: Ссылка на новое содержащееся значение.

Throws: Любое исключение, созданное выбранным конструкторомVT.

Remarks: Если во время вызоваVTконструктора возникает исключение , *this он не содержит значения и любое ранее содержащееся значение было уничтожено. Функция не должна участвовать в разрешении перегрузки, за исключением случаев, когда is_­copy_­constructible_­v<VT> естьtrue и is_­constructible_­v<VT, initializer_­list<U>&, Args...> естьtrue.

void reset() noexcept;

Effects: Еслиhas_­value() естьtrue, уничтожает содержащееся значение.

Postconditions: has_­value() естьfalse.

void swap(any& rhs) noexcept;

Effects: Меняет состояния*this иrhs.

23.8.3.4 Observers [any.observers]

bool has_value() const noexcept;

Returns: true если*this содержит объект, в противном случаеfalse.

const type_info& type() const noexcept;

Returns: typeid(T) если*this имеет содержащееся значение типаT, в противном случаеtypeid(void).

[ Note: Полезно для запросов к типам, известным либо во время компиляции, либо только во время выполнения. ] end note