Руководства по выводу типов для 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