23 General utilities library [utilities]

23.14 Function objects [function.objects]

23.14.11 Function object binders [func.bind]

В этом подпункте описывается унифицированный механизм привязки аргументов вызываемых объектов.

23.14.11.1 Class template is_­bind_­expression [func.bind.isbind]

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 вызове.

23.14.11.2 Class template is_­placeholder [func.bind.isplace]

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 должен рассматриваться как тип-заполнитель.

23.14.11.3 Function template bind [func.bind.bind]

В следующем тексте:

  • 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 вызывает исключение.

Throws: Ничего, если конструкция 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 вызывает исключение.

Throws: Ничего, если конструкция 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 &.

23.14.11.4 Placeholders [func.bind.place]

namespace std::placeholders {
  // M is the implementation-defined number of placeholders
  see below _1;
  see below _2;
              .
              .
              .
  see below _M;
}

Все типы заполнителей должны бытьDefaultConstructible и CopyConstructible, а их конструкторы по умолчанию и конструкторы копирования / перемещения не должны вызывать исключений. Это определяется реализацией ли типы заполнителей являютсяCopyAssignable.CopyAssignable Операторы присваивания копий заполнителей не должны вызывать исключений.

Заполнители следует определять как:

inline constexpr unspecified _1{};

Если это не так, они должны быть объявлены как:

extern unspecified _1;