В этом подпункте описывается полиморфный класс-оболочка, который инкапсулирует произвольные вызываемые объекты.
Исключение типаbad_function_call выдается функциейfunction::operator() ([func.wrap.func.inv]), когда объект-оболочка функции не имеет цели.
namespace std {
class bad_function_call : public exception {
public:
// [func.wrap.badcall.const], constructor
bad_function_call() noexcept;
};
}
bad_function_call() noexcept;
namespace std { template<class> class function; // not defined template<class R, class... ArgTypes> class function<R(ArgTypes...)> { public: using result_type = R; // [func.wrap.func.con], construct/copy/destroy function() noexcept; function(nullptr_t) noexcept; function(const function&); function(function&&); template<class F> function(F); function& operator=(const function&); function& operator=(function&&); function& operator=(nullptr_t) noexcept; template<class F> function& operator=(F&&); template<class F> function& operator=(reference_wrapper<F>) noexcept; ~function(); // [func.wrap.func.mod], function modifiers void swap(function&) noexcept; // [func.wrap.func.cap], function capacity explicit operator bool() const noexcept; // [func.wrap.func.inv], function invocation R operator()(ArgTypes...) const; // [func.wrap.func.targ], function target access const type_info& target_type() const noexcept; template<class T> T* target() noexcept; template<class T> const T* target() const noexcept; }; template<class R, class... ArgTypes> function(R(*)(ArgTypes...)) -> function<R(ArgTypes...)>; template<class F> function(F) -> function<see below>; // [func.wrap.func.nullptr], Null pointer comparisons template <class R, class... ArgTypes> bool operator==(const function<R(ArgTypes...)>&, nullptr_t) noexcept; template <class R, class... ArgTypes> bool operator==(nullptr_t, const function<R(ArgTypes...)>&) noexcept; template <class R, class... ArgTypes> bool operator!=(const function<R(ArgTypes...)>&, nullptr_t) noexcept; template <class R, class... ArgTypes> bool operator!=(nullptr_t, const function<R(ArgTypes...)>&) noexcept; // [func.wrap.func.alg], specialized algorithms template <class R, class... ArgTypes> void swap(function<R(ArgTypes...)>&, function<R(ArgTypes...)>&) noexcept; }
function Шаблон класса обеспечивает полиморфные упаковщики, обобщающие понятие указателя функции. Оболочки могут хранить, копировать и вызывать произвольныеcallable objects, заданные a call signature, что позволяет функциям быть первоклассными объектами.
Acallable typeF используетсяLvalue-Callable для типов аргументовArgTypes и типа возвращаемого значения,R если выражение INVOKE<R>(declval<F&>(), declval<ArgTypes>()...), рассматриваемое как aunevaluated operand, имеет правильный формат ([func.require]).
[ Note: Типы, определенные в руководствах по вычетам,function могут измениться в будущих версиях этого международного стандарта. ] — end note
function() noexcept;
function(nullptr_t) noexcept;
function(const function& f);
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);
Remarks: Этот шаблон конструктора не должен участвовать в разрешении перегрузки, если только он не F предназначенLvalue-Callable для типов аргументов ArgTypes... и типа возвращаемого значенияR.
В противном случае*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);
function& operator=(function&& f);
function& operator=(nullptr_t) noexcept;
template<class F> function& operator=(F&& f);
Remarks: Этот оператор присваивания не должен участвовать в разрешении перегрузки, кромеdecay_t<F> как Lvalue-Callable для типов аргументовArgTypes... и типа возвращаемого значенияR.
template<class F> function& operator=(reference_wrapper<F> f) noexcept;
~function();
void swap(function& other) noexcept;
explicit operator bool() const noexcept;
R operator()(ArgTypes... args) const;
Returns:INVOKE<R>(f, std::forward<ArgTypes>(args)...) ([func.require]), гдеf -target object оф*this.
const type_info& target_type() const noexcept;
template<class T> T* target() noexcept;
template<class T> const T* target() const noexcept;
template <class R, class... ArgTypes>
bool operator==(const function<R(ArgTypes...)>& f, nullptr_t) noexcept;
template <class R, class... ArgTypes>
bool operator==(nullptr_t, const function<R(ArgTypes...)>& f) noexcept;
template <class R, class... ArgTypes>
bool operator!=(const function<R(ArgTypes...)>& f, nullptr_t) noexcept;
template <class R, class... ArgTypes>
bool operator!=(nullptr_t, const function<R(ArgTypes...)>& f) noexcept;
template<class R, class... ArgTypes>
void swap(function<R(ArgTypes...)>& f1, function<R(ArgTypes...)>& f2) noexcept;