Spec-Zone.ru › C++

Руководства по выводу типов для std::function

Определено в заголовке <functional>
template< class R, class... ArgTypes >
function( R(*)(ArgTypes...) ) -> function<R(ArgTypes...)>;
(1) (с C++17)
template< class F >
function( F ) -> function</*see below*/>;
(2) (с C++17)
template< class F >
function( F ) -> function</*see below*/>;
(3) (с C++23)
template< class F >
function( F ) -> function</*see below*/>;
(4) (с C++23)
1) Это руководство по выводу типов предоставляется для std::function, чтобы позволить вывод типов из функций.
2) Этот перегрузчик участвует в разрешении перегрузки только в том случае, если &F::operator() является корректным выражением, когда рассматривается как неоцениваемое операнд, и decltype(&F::operator()) имеет вид R(G::*)(A...) (при необходимости с квалификаторами cv, noexcept, или квалификатором lvalue ссылки). Выведенный тип — std::function<R(A...)>.
3) Этот перегрузчик участвует в разрешении перегрузки только в том случае, если &F::operator() является корректным выражением, когда рассматривается как неоцениваемое операнд, и F::operator() является явным параметром объекта с типом в форме R(G, A...) или R(G, A...) noexcept. Выведенный тип — std::function<R(A...)>.
4) Этот перегрузчик участвует в разрешении перегрузки только в том случае, если &F::operator() является корректным выражением, когда рассматривается как неоцениваемое операнд, и F::operator() является статическим членом функции с типом в форме R(A...) или R(A...) noexcept. Выведенный тип — std::function<R(A...)>.

Примечания

Эти руководства по выводу типов не позволяют выводить тип из функции с параметром эллипса, и ... в типах всегда обрабатывается как расширение пакета.

Тип, выведенный с помощью этих руководств по выводу типов, может измениться в более поздней редакции стандарта (в частности, это может произойти, если поддержка noexcept будет добавлена к std::function в более поздней редакции стандарта).

Пример

#include <functional>
int func(double) { return 0; }
int main() {
  std::function f{func}; // guide #1 deduces function<int(double)>
  int i = 5;
  std::function g = [&](double) { return i; }; // guide #2 deduces function<int(double)>
}

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Корректное поведение
LWG 3238 C++17 поведение (2) было неясно, когда
F::operator() имеет квалификатор &&
уточнено, что оно исключено из разрешения перегрузки

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/functional/function/deduction_guides

Spec-Zone.ru

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