7
7
``` cpp
8
8
namespace std {
9
9
template <class F, class... Args>
10
- constexpr unspecified bind_back(F&&, Args&&...);
10
+ constexpr unspecified bind_back(F&& f, Args&&... args); // (1) C++23
11
+
12
+ template <auto f, class... Args>
13
+ constexpr unspecified bind_back(Args&&... args); // (2) C++26
11
14
}
12
15
```
13
16
* unspecified[italic]
@@ -17,16 +20,24 @@ namespace std {
17
20
18
21
先頭から適用する場合は[`bind_front`](bind_front.md)を用いる。
19
22
20
- ## テンプレートパラメータ制約
21
- [`decay_t`](/reference/type_traits/decay.md)`<F>`を適用した型を`FD`、
22
- [`std::decay_t`](/reference/type_traits/decay.md)`<Args>...`を適用した型パラメータパックを`BoundArgs`であるとして、
23
23
24
- - `FD`が[`std::move_constructible`](/reference/concepts/move_constructible.md)要件を満たすこと
25
- - `BoundArgs`のそれぞれの型`Ti`が[オブジェクト型](/reference/type_traits/is_object.md)である場合、[`std::move_constructible`](/reference/concepts/move_constructible.md)要件を満たすこと
24
+ ## 事前条件
25
+ [`decay_t`](/reference/type_traits/decay.md)`<F>`を適用した型を`FD`、[`decay_t`](/reference/type_traits/decay.md)`<Args>...`を適用した型パラメータパックを`BoundArgs`として
26
+
27
+ - (1) :
28
+ - `FD`がCpp17MoveConstructible要件を満たすこと
29
+ - `BoundArgs`のそれぞれの型`Ti`が[オブジェクト型](/reference/type_traits/is_object.md)である場合、Cpp17MoveConstructible要件を満たすこと
30
+ - (2) :
31
+ - `BoundArgs`のそれぞれの型`Ti`がCpp17MoveConstructible要件を満たすこと
26
32
27
33
28
34
## 適格要件
29
- - [`conjunction_v`](/reference/type_traits/conjunction.md)`<`[`is_constructible`](/reference/type_traits/is_constructible.md)`<FD, F>,` [`is_move_constructible`](/reference/type_traits/is_move_constructible.md)`<FD>,` [`is_constructible`](/reference/type_traits/is_constructible.md)`<BoundArgs, Args>...,` [`is_move_constructible`](/reference/type_traits/is_move_constructible.md)`<BoundArgs>...>`が`true`であること
35
+ - (1) :
36
+ - [`is_constructible_v`](/reference/type_traits/is_constructible.md)`<FD, F> &&` [`is_move_constructible_v`](/reference/type_traits/is_move_constructible.md)`<FD> &&` `(`[`is_constructible_v`](/reference/type_traits/is_constructible.md)`<BoundArgs, Args> && ...) &&` `(`[`is_move_constructible_v`](/reference/type_traits/is_move_constructible.md)`<BoundArgs> && ...)`が`true`であること
37
+ - (2) : `F`を`f`の型として
38
+ - `(`[`is_constructible_v`](/reference/type_traits/is_constructible.md)`<BoundArgs, Args> && ...)`が`true`、かつ
39
+ - `(`[`is_move_constructible_v`](/reference/type_traits/is_move_constructible.md)`<BoundArgs> && ...)`が`true`、かつ
40
+ - もし[`is_poinetr_v`](/reference/type_traits/is_pointer.md)`<F> ||` [`is_member_poinetr_v`](/reference/type_traits/is_member_pointer.md)`<F>`が`true`ならば、`f != nullptr`であること
30
41
31
42
32
43
## 戻り値
@@ -35,8 +46,11 @@ namespace std {
35
46
36
47
返される関数オブジェクトは渡された引数(`f, args...`)を参照として保持せず、適切にコピー/ムーブして保持する。
37
48
49
+
38
50
## 例外
39
- - 関数オブジェクト`f`のムーブによって任意の例外が送出される可能性がある
51
+ - (1) : 関数オブジェクト`f`のムーブによって任意の例外が送出される可能性がある
52
+ - (2) : `bound_args`の初期化による任意の例外が送出される可能性がある
53
+
40
54
41
55
## この機能が必要になった背景・経緯
42
56
@@ -132,6 +146,9 @@ int main() {
132
146
- [ ICC] ( /implementation.md#icc ) : ??
133
147
- [ Visual C++] ( /implementation.md#visual_cpp ) : ??
134
148
149
+
135
150
## 参照
136
151
- [ P2387R3 Pipe support for user-defined range adaptors] ( https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2387r3.html#nanorange )
137
152
- [ rangesのパイプにアダプトするには] ( https://onihusube.hatenablog.com/entry/2022/04/24/010041 )
153
+ - [ P2714R1 Bind front and back to NTTP callables] ( https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2714r1.html )
154
+ - C++26でオーバーロード(2)を追加
0 commit comments