◐ Shell
clean mode source ↗

Объекты функции — cppreference.com

Объект функция, это любой объект, для которого определён оператор вызова функции. C++ предоставляет множество встроенных объектов функций, а также поддержку для создания и управления новыми объектами функциями.

Вызов функции

Операция только для пояснения INVOKE(f, t1, t2, ..., tN) определяется следующим образом для заданного типа T1 как std::remove_cv<std::remove_reference<decltype(t1)>::type>::type:

  • (t1.*f)(t2, ..., tN), если std::is_same<T, T1>::value || std::is_base_of<T, T1>::value равно true.
  • (t1.get().*f)(t2, ..., tN) if T1 является специализацией std::reference_wrapper.
  • ((*t1).*f)(t2, ..., tN) if T1 не соответствует двум предыдущим условиям.
  • t1.*f, если std::is_same<T, T1>::value || std::is_base_of<T, T1>::value равно true.
  • t1.get().*f, если T1 является специализацией std::reference_wrapper.
  • (*t1).*f, если T1 не соответствует двум предыдущим условиям.
  • Иначе INVOKE(f, t1, t2, ..., tN) эквивалентно f(t1, t2, ..., tN) (то есть f является FunctionObject).

Операция только для пояснения INVOKE<R>(f, t1, t2, ..., tN) определяется как static_cast<void>(INVOKE(f, t1, t2, ..., tN)), если R равно (возможно, cv-квалифицированный) void, иначе INVOKE(f, t1, t2, ..., tN) неявно преобразуется в R.

Если std::reference_converts_from_temporary_v
<R, decltype(INVOKE(f, t1, t2, ..., tN))>
равно true, INVOKE<R>(f, t1, t2, ..., tN) некорректно.

(начиная с C++23)
(начиная с C++11)


std::invoke и std::invoke_r (начиная с C++23) может вызывать любой объект Callable с заданными аргументами в соответствии с правилами INVOKE и INVOKE<R> (начиная с C++23).

вызывает любой Callable объект с данными аргументами и имеет возможность указать тип возврата (начиная с C++23)
(шаблон функции) [править]

Обёртки функций

std::function обеспечивает поддержку для хранения произвольных объектов функций.

(C++11)

обёртывает вызываемый объект любого конструируемого копированием типа с указанной сигнатурой вызова функции
(шаблон класса) [править]
обёртывает вызываемый объект любого типа с указанной сигнатурой вызова функции
(шаблон класса) [править]
уточнение std::move_only_function, которое обертывает вызываемый объект любого конструируемого копированием типа
(шаблон класса) [править]
невладеющая ссылка на любой вызываемый объект с указанной сигнатурой вызова функции
(шаблон класса) [править]
исключение, возникающее при вызове пустой std::function
(класс) [править]

(C++11)

создаёт объект функцию из указателя на элемент
(шаблон функции) [править]

Идентичность

std::identity это объект функции идентификации: он возвращает свой аргумент без изменений.

объект функция, который возвращает свой аргумент без изменений
(класс) [править]

Частичное применение функции

std::bind_front и std::bind обеспечивают поддержку частичного применения функции, то есть привязку аргументов к функциям для создания новых функций.

(C++20)(C++23)

связывает переменное количество аргументов по порядку с объектом функцией
(шаблон функции) [править]

(C++11)

связывает один или несколько аргументов с объектом функцией
(шаблон функции) [править]
указывает, что объект является выражением std::bind или может использоваться самостоятельно
(шаблон класса) [править]
указывает, что объект является стандартным заполнителем или может использоваться самостоятельно
(шаблон класса) [править]

Определены в пространстве имён std::placeholders

заполнители для несвязанных аргументов в выражении std::bind
(константа) [править]

Отрицатели

std::not_fn создаёт объект функции, который отрицает результат переданного ему вызываемого объекта.

создаёт объект функции, который возвращает дополнение результата объекта функции, который он содержит
(шаблон функции) [править]

Поисковые функции

Предусмотрены поисковые функции, реализующие несколько алгоритмов поиска по строкам, которые могут использоваться либо напрямую, либо с std::search.

Обёртки ссылок

Обёртки ссылок позволяют сохранять ссылочные аргументы в копируемых объектах функциях:

Объекты функции операторы

C++ определяет несколько объектов функций, которые представляют общие арифметические и логические операции:

Арифметические операции
объект функция, реализующий x + y
(шаблон класса) [править]
объект функция, реализующий x - y
(шаблон класса) [править]
объект функция, реализующий x * y
(шаблон класса) [править]
объект функция, реализующий x / y
(шаблон класса) [править]
объект функция, реализующий x % y
(шаблон класса) [править]
объект функция, реализующий -x
(шаблон класса) [править]
Сравнения
функциональный объект, реализующий x == y
(шаблон класса) [править]
функциональный объект, реализующий x != y
(шаблон класса) [править]
функциональный объект, реализующий x > y
(шаблон класса) [править]
функциональный объект, реализующий x < y
(шаблон класса) [править]
функциональный объект, реализующий x >= y
(шаблон класса) [править]
функциональный объект, реализующий x <= y
(шаблон класса) [править]
Логические операции
объект функция, реализующий x && y
(шаблон класса) [править]
объект функция, реализующий x || y
(шаблон класса) [править]
объект функция, реализующий !x
(шаблон класса) [править]
Побитовые операции
объект функция, реализующий x & y
(шаблон класса) [править]
объект функция, реализующий x | y
(шаблон класса) [править]
объект функция, реализующий x ^ y
(шаблон класса) [править]

(C++14)

объект функция, реализующий ~x
(шаблон класса) [править]

Объекты функции ограниченного сравнения

C++20 определяет набор объектов функций ограниченного сравнения. Операторы равенства (ranges::equal_to и ranges::not_equal_to) требуют типы аргументов для модели equality_comparable_with. Операторы отношения (ranges::less, ranges::greater, ranges::less_equal и ranges::greater_equal) требуют типы аргументов модели totally_ordered_with. Оператору трёхстороннего сравнения требуется (compare_three_way) тип для модели three_way_comparable_with.

функциональный объект, реализующий x == y
(класс) [править]
функциональный объект, реализующий x != y
(класс) [править]
функциональный объект, реализующий x < y
(класс) [править]
функциональный объект, реализующий x > y
(класс) [править]
функциональный объект, реализующий x <= y
(класс) [править]
функциональный объект, реализующий x >= y
(класс) [править]
функциональный объект, реализующий x <=> y
(класс) [править]

Старые привязки и адаптеры

Несколько утилит, которые обеспечивали раннюю функциональную поддержку, устарели в C++11 и удалены в C++17 (старые отрицатели устарели в C++17 и удалены в C++20):

Основа

(устарело в C++11)(удалено в C++17)

совместимый с адаптором базовый класс унарной функции
(шаблон класса) [править]

(deprecated in C++11)(удалено в C++17)

совместимый с адаптером базовый класс бинарной функции
(шаблон класса) [править]
Привязки

(устарело в C++11)(удалено в C++17)

объект функции, содержащий бинарную функцию и один из её аргументов
(шаблон класса) [править]

(устарело в C++11)(удалено в C++17)

связывает один аргумент с бинарной функцией
(шаблон функции) [править]
Адаптеры функций

(устарело в C++11)(удалено в C++17)

совместимая с адаптером обёртка для указателя на унарную функцию
(шаблон класса) [править]

(устарело в C++11)(удалено в C++17)

совместимая с адаптером обёртка для указателя на бинарную функцию
(шаблон класса) [править]

(устарело в C++11)(удалено в C++17)

создаёт совместимую с адаптером обёртку функционального объекта из указателя на функцию
(шаблон функции) [править]

(устарело в C++11)(удалено в C++17)

оболочка для указателя на нульарную или унарную функцию-элемент, вызываемую с указателем на объект
(шаблон класса) [править]

(устарело в C++11)(удалено в C++17)

создаёт оболочку из указателя на функцию-элемент, вызываемую через указатель на объект
(шаблон функции) [править]

(устарело в C++11)(удалено в C++17)

оболочка для указателя на нульарную или унарную функцию-элемент, вызываемую со ссылкой на объект
(шаблон класса) [править]

(устарело в C++11)(удалено в C++17)

создаёт оболочку из указателя на функцию-элемент, вызываемую со ссылкой на объект
(шаблон функции) [править]

(устарело в C++17)(удалено в C++20)

обёртка объекта функции, возвращающая дополнение к унарному предикату, содержащемуся в ней
(шаблон класса) [править]

(deprecated in C++17)(удалено в C++20)

объект функции-обёртки, возвращающий дополнение к содержащемуся в нём бинарному предикату
(шаблон класса) [править]

(устарело в C++17)(удалено в C++20)

создаёт пользовательский объект std::unary_negate
(шаблон функции) [править]

(устарело в C++17)(удалено в C++20)

создаёт пользовательский объект std::binary_negate
(шаблон функции) [править]

Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 185 C++98 использование функциональных объектов повысило эффективность
программы
утверждение удалено
LWG 660 C++98 функциональные объекты для побитовых операций отсутствуют добавлены
LWG 2219 C++11 INVOKE неправильно обрабатывал std::reference_wrapper обрабатывает правильно
LWG 2420 C++11 INVOKE<R> не отбрасывал возвращаемое значение, если R равно void отбрасывает возвращаемое значение в
этом случае
LWG 2926 C++11 синтаксис операции INVOKE с возвращаемым типом R был следующим:
INVOKE(f, t1, t2, ..., tN, R)
изменено на
INVOKE<R>(f, t1, t2, ..., tN)
LWG 3655 C++11 INVOKE неправильно обрабатывал объединения из-за разрешения
LWG проблема 2219
обрабатывает правильно