std::function の推論ガイド
From 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() が well-formed であり、decltype(&F::operator()) が R(G::*)(A...) の形式(オプションで cv 修飾、オプションで noexcept、オプションで lvalue 参照修飾)である場合にのみ、オーバーロード解決に参加します。推論される型は std::function<R(A...)> です。
3) このオーバーロードは、評価されないオペランドとして扱われた場合に &F::operator() が well-formed であり、F::operator() が 明示的なオブジェクトパラメータ関数であり、その型が R(G, A...) または R(G, A...) noexcept の形式である場合にのみ、オーバーロード解決に参加します。推論される型は std::function<R(A...)> です。
4) このオーバーロードは、評価されないオペランドとして扱われた場合に &F::operator() が well-formed であり、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() が &&-修飾されている |
オーバーロード解決から除外されるように明確化 |