Spec-Zone.ru › C++

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

См. также

operator()
вызывает целевой объект
(открытая функция-член std::function<R(Args...)>)
operator()
вызывает сохранённую функцию
(открытая функция-член std::reference_wrapper<T>)
invokeinvoke_r
(C++17)(C++23)
вызывает любой объект Callable с заданными аргументами с возможностью указать тип возвращаемого значения(начиная с C++23)
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/functional/move_only_function/operator()

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API