std::move_only_function::operator()
Материал из cppreference.com
< cpp | utility | functional | move only function
R operator()( Args... args)/*cv*//*ref*/noexcept(/*noex*/); | (начиная с C++23) | |
Вызывает сохранённую вызываемую цель с параметрами args
. Части /*cv*/, /*ref*/ и /*noex*/ функции operator() идентичны параметрам шаблона std::move_only_function
.
Эквивалентно returnstd::invoke_r<R>(/*cv-ref-cast*/(f), std::forward<Args>(args)...);, где f
cv-неквалифицированное lvalue, обозначающее целевой объект *this, а /*cv-ref-cast*/(f) эквивалентно:
- f, если cvref либо пустые, либо &, или
- std::as_const(f), если cvref равны const или const&, или
- std::move(f), если cvref равны &&, или
- std::move(std::as_const(f)), если cvref равны 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(){return42;} 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) (шаблон функции) |