77``` cpp
88namespace std {
99 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
1114}
1215```
1316* unspecified[italic]
@@ -17,16 +20,24 @@ namespace std {
1720
1821先頭から適用する場合は[`bind_front`](bind_front.md)を用いる。
1922
20- ## テンプレートパラメータ制約
21- [`decay_t`](/reference/type_traits/decay.md)`<F>`を適用した型を`FD`、
22- [`std::decay_t`](/reference/type_traits/decay.md)`<Args>...`を適用した型パラメータパックを`BoundArgs`であるとして、
2323
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要件を満たすこと
2632
2733
2834## 適格要件
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`であること
3041
3142
3243## 戻り値
@@ -35,8 +46,11 @@ namespace std {
3546
3647返される関数オブジェクトは渡された引数(`f, args...`)を参照として保持せず、適切にコピー/ムーブして保持する。
3748
49+
3850## 例外
39- - 関数オブジェクト`f`のムーブによって任意の例外が送出される可能性がある
51+ - (1) : 関数オブジェクト`f`のムーブによって任意の例外が送出される可能性がある
52+ - (2) : `bound_args`の初期化による任意の例外が送出される可能性がある
53+
4054
4155## この機能が必要になった背景・経緯
4256
@@ -132,6 +146,9 @@ int main() {
132146- [ ICC] ( /implementation.md#icc ) : ??
133147- [ Visual C++] ( /implementation.md#visual_cpp ) : ??
134148
149+
135150## 参照
136151- [ P2387R3 Pipe support for user-defined range adaptors] ( https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2387r3.html#nanorange )
137152- [ 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