Namespaces
Variants

deduction guides for std::function

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
ヘッダーで定義 <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) この deduction guide std::function が関数からの推論を可能にするために提供されています。
2) このオーバーロードは、以下の条件が満たされる場合にのみオーバーロード解決に参加します: & F :: operator ( ) が未評価オペランドとして扱われた際に適切な形式であり、かつ decltype ( & F :: operator ( ) ) R ( G :: * ) ( A... ) の形式(オプションでcv修飾、オプションでnoexcept、オプションで左辺値参照修飾)である場合です。推定される型は std:: function < R ( A... ) > です。
3) このオーバーロードは、以下の条件が満たされる場合にのみオーバーロード解決に参加します: & F :: operator ( ) が未評価オペランドとして扱われた際に well-formed であり、かつ F :: operator ( ) explicit object parameter function であり、その型が R ( G, A... ) または R ( G, A... ) noexcept の形式である場合です。推論される型は std:: function < R ( A... ) > です。
4) このオーバーロードは、以下の条件が満たされる場合にのみオーバーロード解決に参加します: & F :: operator ( ) が未評価オペランドとして扱われた際に適切な形式であり、かつ F :: operator ( ) static member function であり、その型が 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}; // ガイド #1 は function<int(double)> を推論
  int i = 5;
  std::function g = [&](double) { return i; }; // ガイド #2 は function<int(double)> を推論
}

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3238 C++17 (2) の動作が
F :: operator ( ) が&&-qualifiedの場合に不明確
オーバーロード解決から除外されるように明確化