Пространства имён
Варианты
Действия

принципы вывода для std::function

Материал из cppreference.com
< cpp‎ | utility‎ | functional‎ | function
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Объекты функции
Функции обёртки
(C++11)
(C++11)
Применение частичных функций
(C++20)(C++23)
(C++11)
Вызов функции
(C++17)(C++23)
Объект идентичности функции
(C++20)
Обёртки ссылок
(C++11)(C++11)
Прозрачные обёртки операторов
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Отрицатели
(C++17)
Искатели
Ограниченные компараторы
Старые привязки и адаптеры
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
(до C++17*)(до C++17*)
(до C++17*)(до C++17*)

(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
 
 
Определено в заголовочном файле <functional>
template< class R, class... ArgTypes >
function( R(*)(ArgTypes...) ) -> function<R(ArgTypes...)>;
(1) (начиная с C++17)
template< class F >
function( F ) -> function</*смотрите ниже*/>;
(2) (начиная с C++17)
template< class F >
function( F ) -> function</*смотрите ниже*/>;
(3) (начиная с C++23)
template< class F >
function( F ) -> function</*смотрите ниже*/>;
(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...)>.

[править] Примечание

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

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

[править] Пример

#include <functional>
int func(double) { return 0; }
int main() {
  std::function f{func}; // принцип #1 выводит function<int(double)>
  int i = 5;
  std::function g = [&](double) { return i; }; // принцип #2 выводит function<int(double)>
}

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

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