66* cpp11[ meta cpp]
77
88``` cpp
9- function () noexcept ; // (1)
10- function (nullptr_t) noexcept; // (2)
11- function(const function& f); // (3)
9+ function () noexcept ; // (1) C++11
10+ function (nullptr_t) noexcept; // (2) C++11
11+ function(const function& f); // (3) C++11
1212
13- function(function&& f); // (4) C++17まで
13+ function(function&& f); // (4) C++11
1414function(function&& f) noexcept; // (4) C++20
1515
1616template <class F >
17- function(F&& f); // (5)
17+ function(F f); // (5) C++11
18+ template <class F >
19+ function(F&& f); // (5) C++23
1820
1921template <class Alloc >
2022function(allocator_arg_t, const Alloc& alloc) noexcept; // (6) C++17で削除
@@ -34,11 +36,44 @@ function(allocator_arg_t, const Alloc& alloc, F f); // (10) C++17
3436* nullptr_t[link /reference/cstddef/nullptr_t.md]
3537* allocator_arg_t[link /reference/memory/allocator_arg_t.md]
3638
37- ## 要件
38- - (5), (10) :
39- - `F`はコピー構築可能であること。
40- - `F`のコピーコンストラクタとデストラクタは、例外を投げるべきではない。
41- - C++11まで : `F`は、パラメータとして`ArgTypes...`型をとり、戻り値として`R`型を返す関数ポインタ、メンバ関数ポインタ、メンバ変数ポインタ、または関数オブジェクトであること。
39+ ## 概要
40+ `function`オブジェクトを構築する。
41+
42+ - (1) : デフォルト構築。空の`function`オブジェクトを構築する
43+ - (2) : `nullptr`からの構築。空の`function`オブジェクトを構築する
44+ - (3) : コピー構築する
45+ - (4) : ムーブ構築する
46+ - (5) : 任意の型の関数ポインタ、メンバポインタ、関数オブジェクトを受け取って構築する
47+ - (6) : アロケータをとって空の`function`オブジェクトを構築する
48+ - (7) : アロケータと`nullptr`をとって空の`function`オブジェクトを構築する
49+ - (8) : アロケータをとってコピー構築する
50+ - (9) : アロケータをとってムーブ構築する
51+ - (10) : アロケータと、任意の型の関数ポインタ、メンバポインタ、関数オブジェクトを受け取って構築する
52+
53+
54+ ## テンプレートパラメータ制約
55+ [`decay_t`](/reference/type_traits/decay.md)`<F>`を`FD`として、
56+
57+ - (5) :
58+ - C++11
59+ - `F`は、パラメータとして`ArgTypes...`型をとり、戻り値として`R`型を返す関数ポインタ、メンバ関数ポインタ、メンバ変数ポインタ、または関数オブジェクトであること
60+ - C++23
61+ - `F`が`function`ではないこと
62+ - `FD`は、パラメータとして`ArgTypes...`型をとり、戻り値として`R`型を返す関数ポインタ、メンバ関数ポインタ、メンバ変数ポインタ、または関数オブジェクトであること
63+ - (10) :
64+ - `F`はコピー構築可能であること
65+ - `F`のコピーコンストラクタとデストラクタは、例外を投げるべきではない
66+ - `F`は、パラメータとして`ArgTypes...`型をとり、戻り値として`R`型を返す関数ポインタ、メンバ関数ポインタ、メンバ変数ポインタ、または関数オブジェクトであること
67+
68+
69+ ## 適格要件
70+ - (5) :
71+ - C++11
72+ - `F`はコピー構築可能であること
73+ - `F`は、パラメータとして`ArgTypes...`型をとり、戻り値として`R`型を返す関数ポインタ、メンバ関数ポインタ、メンバ変数ポインタ、または関数オブジェクトであること。
74+ - C++23
75+ - `FD`はコピー構築可能であること
76+ - `FD`は`F`から構築可能であること
4277
4378
4479## 効果
@@ -242,3 +277,5 @@ int main()
242277 - C++14から、(5)と(10)でシグニチャが合わない関数オブジェクトが渡された場合に、SFINAEされるようになった。
243278- [ P0302R1 Removing Allocator Support in ` std::function ` (rev 1)] ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0302r1.html )
244279- [ P0771R1 std::function move constructor should be noexcept] ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0771r1.pdf )
280+ - [ LWG Issue 2774. ` std::function ` construction vs assignment] ( https://cplusplus.github.io/LWG/issue2774 )
281+ - C++23から、` function(F) ` のオーバーロードが` function(F&&) ` に変更された
0 commit comments