std::move_only_function::operator()
Материал из cppreference.com
<tbody>
</tbody>
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 cv-неквалифицированное lvalue, обозначающее целевой объект *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) // можно передать по значению
{
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
Смотрите также
| вызывает цель (public функция-элемент std::function<R(Args...)>)
| |
| вызывает сохранённую функцию (public функция-элемент std::reference_wrapper)
| |
(C++17)(C++23) |
вызывает любой Callable объект с данными аргументами и имеет возможность указать тип возврата (начиная с C++23) (шаблон функции) |