std::move_only_function::operator()
R operator()( Args... args ) /*cv*/ /*ref*/ noexcept(/*noex*/); |
(с C++23) |
Вызывает сохранённый вызываемый объект с параметрами args. Части /*cv*/, /*ref*/, и /*noex*/ operator() идентичны частям шаблонного параметра std::move_only_function.
Эквивалентно return std::invoke_r<R>(/*cv-ref-cast*/(f), std::forward<Args>(args)...);, где f — это lvalue без cv-квалификаторов, обозначающая целевой объект *this, а /*cv-ref-cast*/(f) эквивалентно:
-
fесли cv ref пусто или&, или -
std::as_const(f)если cv ref равноconstилиconst &, или -
std::move(f)если cv ref равно&&, или -
std::move(std::as_const(f))если cv ref равноconst &&.
Поведение не определено, если *this пусто.
Параметры
| args | - | параметры для передачи сохранённому вызываемому объекту |
Возвращаемое значение
std::invoke_r<R>(/*cv-ref-cast*/(f), std::forward<Args>(args)...).
Исключения
Передает исключение, брошенное вызовом подлежащей функции.
Пример
Следующий пример демонстрирует, как std::move_only_function может передаваться другим функциям по значению. Также, он показывает, как std::move_only_function может хранить лямбда-выражения.
#include <iostream>
#include <functional>
void call(std::move_only_function<int() const> f) // can be passed by value
{
std::cout << f() << '\n';
}
int normal_function()
{
return 42;
}
int main()
{
int n = 1;
auto lambda = [&n](){ return n; };
std::move_only_function<int() const> f = lambda;
call(std::move(f));
n = 2;
call(lambda);
f = normal_function;
call(std::move(f));
}Вывод:
1 2 42
См. также
| вызывает целевой (общедоступный член-функция std::function<R(Args...)>) |
|
| вызывает сохранённую функцию (общедоступный член-функция std::reference_wrapper<T>) |
|
|
(C++17)(C++23) |
вызывает любой вызываемый объект с заданными аргументами и возможностью указать тип возвращаемого значения(с C++23) (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/functional/move_only_function/operator()