Чтобы включить старые функции адаптеров для управления объектами функции , которые принимают один или два аргумент, многие из функциональных объектов в настоящем стандарте , соответственно , обеспечивают typedef-names argument_type иresult_type для функциональных объектов , которые принимают один аргумент и first_argument_type,second_argument_typeиresult_type для функциональных объектов , которые принимают два аргумента.
Следующие имена членов определены в дополнение к именам, указанным в Пункте[function.objects]:
namespace std { template<class T> struct owner_less<shared_ptr<T>> { using result_type = bool; using first_argument_type = shared_ptr<T>; using second_argument_type = shared_ptr<T>; }; template<class T> struct owner_less<weak_ptr<T>> { using result_type = bool; using first_argument_type = weak_ptr<T>; using second_argument_type = weak_ptr<T>; }; template <class T> class reference_wrapper { public : using result_type = see below; // not always defined using argument_type = see below; // not always defined using first_argument_type = see below; // not always defined using second_argument_type = see below; // not always defined }; template <class T> struct plus { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct minus { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct multiplies { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct divides { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct modulus { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct negate { using argument_type = T; using result_type = T; }; template <class T> struct equal_to { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct not_equal_to { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct greater { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct less { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct greater_equal { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct less_equal { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct logical_and { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct logical_or { using first_argument_type = T; using second_argument_type = T; using result_type = bool; }; template <class T> struct logical_not { using argument_type = T; using result_type = bool; }; template <class T> struct bit_and { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct bit_or { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct bit_xor { using first_argument_type = T; using second_argument_type = T; using result_type = T; }; template <class T> struct bit_not { using argument_type = T; using result_type = T; }; template<class R, class T1> class function<R(T1)> { public: using argument_type = T1; }; template<class R, class T1, class T2> class function<R(T1, T2)> { public: using first_argument_type = T1; using second_argument_type = T2; }; }
reference_wrapper<T> имеетweak result type. ЕслиT - это тип функции, result_type должен быть синонимом возвращаемого типаT.
Специализация шаблонаreference_wrapper<T> должна определять вложенный тип, названныйargument_type как синоним,T1 только если типT является одним из следующих:
тип функции или указатель на тип функции, принимающий один аргумент типаT1
указатель на функцию-членR T0::f()cv (гдеcv представляет cv-квалификаторы функции-члена); типT1 этоcvT0*
тип класса, где qualified-idT::argument_type допустим и обозначает тип ([temp.deduct]); типT1 естьT::argument_type.
Создание экземпляра шаблонаreference_wrapper<T> должно определять два вложенных типа с именамиfirst_argument_type иsecond_argument_type как синонимы дляT1 иT2, соответственно, только если типT является одним из следующих:
тип функции или указатель на тип функции, принимающий два аргумента типаT1 иT2
указатель на функцию-членR T0::f(T2)cv (гдеcv представляет cv-квалификаторы функции-члена); типT1 этоcvT0*
тип класса , где qualified-ids T::first_argument_type иT::second_argument_type являются действительными и оба типа обозначают ([temp.deduct]); типT1 естьT::first_argument_type и типT2 естьT::second_argument_type.
Все включенные специализацииhash<Key> изhash ([unord.hash]) обеспечивают два вложенных типов,result_type иargument_type, которые должны быть синонимыsize_t иKey, соответственно.
Обертка переадресации вызовов,g возвращаемая вызовомbind(f, bound_args...) ([func.bind.bind]), должна иметьweak result type.
Обертка переадресации вызова,g возвращаемая вызовомbind<R>(f, bound_args...) ([func.bind.bind]), должна иметь вложенный тип,result_type определенный как синоним дляR.
Простая оболочка вызова, возвращаемая из вызова,mem_fn(pm) должна иметь вложенный тип,result_type который является синонимом возвращаемого типа,pm когдаpm является указателем на функцию-член.
Простая оболочка вызова, возвращаемая при вызове,mem_fn(pm) должна определять два вложенных типа с именамиargument_type иresult_type как синонимы дляcvT* иRet, соответственно, когдаpm является указателем на функцию-член с квалификатором cvcv и не принимает аргументов, гдеRet -pmтип возвращаемого значения.
Простая оболочка вызова, возвращаемая из вызова,mem_fn(pm) должна определять три вложенных типа с именамиfirst_argument_type,second_argument_typeиresult_type как синонимы дляcvT*,T1иRet, соответственно, когдаpm является указателем на функцию-член с квалификатором cvcv и принимает один аргумент типаT1, гдеRet -pmэто return тип.
Следующие имена членов определены в дополнение к именам, указанным в Пункте[containers]:
namespace std { template <class Key, class T, class Compare, class Allocator> class map<Key, T, Compare, Allocator>::value_compare { public: using result_type = bool; using first_argument_type = value_type; using second_argument_type = value_type; }; template <class Key, class T, class Compare, class Allocator> class multimap<Key, T, Compare, Allocator>::value_compare { public: using result_type = bool; using first_argument_type = value_type; using second_argument_type = value_type; }; }