23 General utilities library [utilities]

23.14 Function objects [function.objects]

23.14.13 Polymorphic function wrappers [func.wrap]

23.14.13.2 Class template function [func.wrap.func]

23.14.13.2.1 function construct/copy/destroy [func.wrap.func.con]

function() noexcept;

Postconditions: !*this.

function(nullptr_t) noexcept;

Postconditions: !*this.

function(const function& f);

Postconditions: !*this если !f; в противном случае *this нацелена на копию f.target().

Throws: не должен генерировать исключения, если fцель является специализацией reference_­wrapper или указателем на функцию. В противном случае может вызвать bad_­alloc или любое исключение, созданное конструктором копирования сохраненного вызываемого объекта. [ Note: Реализациям рекомендуется избегать использования динамически выделяемой памяти для небольших вызываемых объектов, например, где fцелью является объект, содержащий только указатель или ссылку на объект и указатель на функцию-член. ] end note

function(function&& f);

Postconditions: Если !f, *this не имеют целей; в противном случае цель *this эквивалентна цели f до построения и f находится в допустимом состоянии с неопределенным значением.

Throws: не должен генерировать исключения, если fцель является специализацией reference_­wrapper или указателем на функцию. В противном случае может вызвать bad_­alloc или любое исключение, созданное конструктором копирования или перемещения сохраненного вызываемого объекта. [ Note: Реализациям рекомендуется избегать использования динамически выделяемой памяти для небольших вызываемых объектов, например, где fцелью является объект, содержащий только указатель или ссылку на объект и указатель на функцию-член. ] end note

template<class F> function(F f);

Requires: F будет CopyConstructible.

Remarks: Этот шаблон конструктора не должен участвовать в разрешении перегрузки, если только он не F предназначен Lvalue-Callable для типов аргументов ArgTypes... и типа возвращаемого значения R.

Postconditions: !*this если выполняется какое-либо из следующих условий:

  • f - значение указателя нулевой функции.

  • f - значение указателя на нулевой член.

  • F является экземпляром function шаблона класса, а !f.

В противном случае *this нацелена на копию, f инициализированную с помощью std​::​move(f). [ Note: Реализациям рекомендуется избегать использования динамически выделяемой памяти для небольших вызываемых объектов, например, где f объект, содержащий только указатель или ссылку на объект и указатель на функцию-член. ] end note

Throws: не должен генерировать исключения, если f это указатель на функцию или reference_­wrapper<T> для некоторых T. В противном случае может вызвать bad_­alloc или любое исключение, созданное конструктором Fкопирования или перемещения.

template<class F> function(F) -> function<see below>;

Remarks: Это руководство по выводу участвует в разрешении перегрузки только в том случае, если &F​::​operator() оно правильно сформировано, когда рассматривается как неоцененный операнд. В том случае, если decltype(&F​::​operator()) is имеет форму R(G​::​*)(A...) cv &opt noexceptopt для типа класса G, то выводимый тип имеет вид function<R(A...)>.

[Example:

void f() {
  int i{5};
  function g = [&](double) { return i; }; // deduces function<int(double)>
}

end example]

function& operator=(const function& f);

Effects: Как если бы function(f).swap(*this);

Returns: *this.

function& operator=(function&& f);

Effects: Заменяет цель *this на цель f.

Returns: *this.

function& operator=(nullptr_t) noexcept;

Effects: Если *this != nullptr, уничтожает цель this.

Postconditions: !(*this).

Returns: *this.

template<class F> function& operator=(F&& f);

Effects: Как будто по: function(std​::​forward<F>(f)).swap(*this);

Returns: *this.

Remarks: Этот оператор присваивания не должен участвовать в разрешении перегрузки, кроме decay_­t<F> как Lvalue-Callable для типов аргументов ArgTypes... и типа возвращаемого значения R.

template<class F> function& operator=(reference_wrapper<F> f) noexcept;

Effects: Как будто по: function(f).swap(*this);

Returns: *this.

~function();

Effects: Если *this != nullptr, уничтожает цель this.