руководства по выводу типов для 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++.
| Отчёт об ошибке | Применён к | Поведение согласно опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 3238 | C++17 | поведение (2) было неясным, когдаF::operator() имеет квалификатор && | уточнено, что она исключается из разрешения перегрузки |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/functional/function/deduction_guides