namespace std {
template<class T> struct is_bind_expression; // see below
}
Шаблон классаis_bind_expression можно использовать для обнаружения функциональных объектов, сгенерированныхbind. Шаблон функцииbind используетсяis_bind_expression для обнаружения подвыражений.
Экземплярыis_bind_expression шаблона должны соответствоватьUnaryTypeTrait требованиям. Реализация должна предоставлять определение, которое имеет базовую характеристику true_type ifT является типом, возвращаемым изbind, в противном случае он должен иметь базовую характеристикуfalse_type. Программа может специализировать этот шаблон для определяемого пользователем типа,T чтобы он имел базовую характеристику,true_type указывающую, что T следует рассматривать как подвыражение вbind вызове.
namespace std {
template<class T> struct is_placeholder; // see below
}
Шаблон классаis_placeholder может быть использован для обнаружения стандартных заполнителей _1,_2и так далее. Шаблон функцииbind используется is_placeholder для обнаружения заполнителей.
Экземплярыis_placeholder шаблона должны соответствоватьUnaryTypeTrait требованиям. Реализация должна предоставлять определение, которое имеет базовую характеристику integral_constant<int, J> ifT is the type std::placeholders::_J, в противном случае оно должно иметь базовую характеристикуintegral_constant<int, 0>. Программа может специализировать этот шаблон для определяемого пользователем типа,T чтобы он имел базовую характеристикуintegral_constant<int, N> with,N > 0 чтобы указать, что онT должен рассматриваться как тип-заполнитель.
В следующем тексте:
FD это типdecay_t<F>,
fd является l-значением типа,FD построенным изstd::forward<F>(f),
Ti этоith тип в пакете параметров шаблонаBoundArgs,
TDi это типdecay_t<Ti>,
ti являетсяith аргументом в параметре функции пакетаbound_args,
tdi является l-значением типа,TDi построенным изstd::forward<Ti>(ti),
Uj -jth выведенный типUnBoundArgs&&... параметра оболочки переадресации вызовов, а
uj этоjth аргумент , связанный сUj.
template<class F, class... BoundArgs>
unspecified bind(F&& f, BoundArgs&&... bound_args);
Requires: is_constructible_v<FD, F> будетtrue. Для каждогоTi вBoundArgs,is_constructible_v<TDi, Ti> должно бытьtrue. INVOKE(fd, w1, w2, …, wN) ([func.require]) Должен быть допустимым выражением для некоторых значенийw1,w2, ...,wN, где N имеет значениеsizeof...(bound_args). Квалификаторы cvcv оболочки вызоваg, как указано ниже, не должны быть ни,volatile ниconst volatile.
Returns: forwarding call wrapperg. Эффектg(u1, u2, …, uM) должен быть
INVOKE(fd, std::forward<V1>(v1), std::forward<V2>(v2), …, std::forward<VN>(vN))
где значения и типы связанных аргументовv1,v2...,vN определяются , как указано ниже. Конструктор копирования и конструктор перемещения оболочки перенаправляющего вызова должны вызывать исключение тогда и только тогда, когда соответствующий конструкторFD любого из типов TDi вызывает исключение.
Remarks: Тип возвращаемого значения должен удовлетворять требованиямMoveConstructible. Если всеFD иTDi удовлетворяют требованиямCopyConstructible, то тип возвращаемого значения должен удовлетворять требованиямCopyConstructible. [ Note: Это подразумевает, что все такFD иTDi естьMoveConstructible. ] — end note
template<class R, class F, class... BoundArgs>
unspecified bind(F&& f, BoundArgs&&... bound_args);
Requires: is_constructible_v<FD, F> будетtrue. Для каждогоTi вBoundArgs,is_constructible_v<TDi, Ti> должно бытьtrue. INVOKE(fd, w1, w2, …, wN) должен быть допустимым выражением для некоторых значенийw1,w2, ...,wN, где N имеет значениеsizeof...(bound_args). Квалификаторы cvcv оболочки вызоваg, как указано ниже, не должны быть ни,volatile ниconst volatile.
Returns: forwarding call wrapperg. Эффект g(u1, u2, …, uM) должен быть
INVOKE<R>(fd, std::forward<V1>(v1), std::forward<V2>(v2), …, std::forward<VN>(vN))
где значения и типы связанных аргументовv1,v2...,vN определяются , как указано ниже. Конструктор копирования и конструктор перемещения оболочки перенаправляющего вызова должны вызывать исключение тогда и только тогда, когда соответствующий конструкторFD любого из типов TDi вызывает исключение.
Remarks: Тип возвращаемого значения должен удовлетворять требованиямMoveConstructible. Если всеFD иTDi удовлетворяют требованиямCopyConstructible, то тип возвращаемого значения должен удовлетворять требованиямCopyConstructible. [ Note: Это подразумевает, что все такFD иTDi естьMoveConstructible. ] — end note
Эти значенияbound argumentsv1,v2, ...,vN и соответствующие их типыV1,V2, ..., вVN зависимости от типов ,TDi полученных от вызоваbind и CV-классификаторовcv обертки вызоваg следующим образом :
еслиTDi естьreference_wrapper<T>, аргумент равенtdi.get() и его типVi равенT&;
если значениеis_bind_expression_v<TDi> равноtrue, аргумент равенtdi(std::forward<Uj>(uj)...) и его типVi равен invoke_result_t<TDi cv &, Uj...>&&;
если значениеj вis_placeholder_v<TDi> не равен нулю, аргументstd::forward<Uj>(uj) и ее типVi являетсяUj&&;
в противном случае значение равно,tdi а его типVi -TDi cv &.
namespace std::placeholders { // M is the implementation-defined number of placeholders see below _1; see below _2; . . . see below _M; }
Все типы заполнителей должны бытьDefaultConstructible и CopyConstructible, а их конструкторы по умолчанию и конструкторы копирования / перемещения не должны вызывать исключений. Это определяется реализацией ли типы заполнителей являютсяCopyAssignable.CopyAssignable Операторы присваивания копий заполнителей не должны вызывать исключений.