принципы вывода для std::function
Материал из cppreference.com
< cpp | utility | functional | function
Определено в заголовочном файле <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) |
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() имеет &&-квалификацию |
исключено из разрешения перегрузки |