|
188 | 188 |
|
189 | 189 | <p class="text-right"><small>
|
190 | 190 | 最終更新日時(UTC):
|
191 |
| - <span itemprop="datePublished" content="2024-03-10T02:30:08"> |
192 |
| - 2024年03月10日 02時30分08秒 |
| 191 | + <span itemprop="datePublished" content="2025-04-03T06:49:54"> |
| 192 | + 2025年04月03日 06時49分54秒 |
193 | 193 | </span>
|
194 | 194 | <br/>
|
195 | 195 | <span itemprop="author" itemscope itemtype="http://schema.org/Person">
|
196 |
| - <span itemprop="name">Tetsuro Matsumura</span> |
| 196 | + <span itemprop="name">yoh</span> |
197 | 197 | </span>
|
198 | 198 | が更新
|
199 | 199 | </small></p>
|
|
215 | 215 | <div class="identifier-type">function template</div><div class="header"><functional></div><h1 itemprop="name"><span class="namespace" title="namespace std">std::</span><span class="token">bind_back</span><span class="cpp cpp23" title="C++23で追加">(C++23)</span></h1>
|
216 | 216 | <div itemprop="articleBody"><p><div class="codehilite"><pre><span></span><code><span class="k">namespace</span> <span class="n">std</span> <span class="p">{</span>
|
217 | 217 | <span class="k">template</span> <span class="o"><</span><span class="k">class</span> <span class="nc">F</span><span class="p">,</span> <span class="n">class</span><span class="p">...</span> <span class="n">Args</span><span class="o">></span>
|
218 |
| - <span class="k">constexpr</span> <span class="n"><i>unspecified</i></span> <span class="n">bind_back</span><span class="p">(</span><span class="n">F</span><span class="o">&&</span><span class="p">,</span> <span class="n">Args</span><span class="o">&&</span><span class="p">...);</span> |
| 218 | + <span class="k">constexpr</span> <span class="n"><i>unspecified</i></span> <span class="n">bind_back</span><span class="p">(</span><span class="n">F</span><span class="o">&&</span> <span class="n">f</span><span class="p">,</span> <span class="n">Args</span><span class="o">&&</span><span class="p">...</span> <span class="n">args</span><span class="p">);</span> <span class="c1">// (1) C++23</span> |
| 219 | + |
| 220 | + <span class="k">template</span> <span class="o"><</span><span class="k">auto</span> <span class="n">f</span><span class="p">,</span> <span class="n">class</span><span class="p">...</span> <span class="n">Args</span><span class="o">></span> |
| 221 | + <span class="k">constexpr</span> <span class="n"><i>unspecified</i></span> <span class="n">bind_back</span><span class="p">(</span><span class="n">Args</span><span class="o">&&</span><span class="p">...</span> <span class="n">args</span><span class="p">);</span> <span class="c1">// (2) C++26</span> |
219 | 222 | <span class="p">}</span>
|
220 | 223 | </code></pre></div>
|
221 | 224 | </p>
|
222 | 225 | <h2>概要</h2>
|
223 | 226 | <p>関数の引数を末尾から順に部分適用する。</p>
|
224 | 227 | <p>先頭から適用する場合は<code><a href="bind_front.html">bind_front</a></code>を用いる。</p>
|
225 |
| -<h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Constraints。関数であればオーバーロード解決に参加するための条件、それ以外であれば受け付ける型の条件">テンプレートパラメータ制約</a></h2> |
226 |
| -<p><code><a href="../type_traits/decay.html">decay_t</a><F></code>を適用した型を<code>FD</code>、 |
227 |
| -<code><a href="../type_traits/decay.html">std::decay_t</a><Args>...</code>を適用した型パラメータパックを<code>BoundArgs</code>であるとして、</p> |
| 228 | +<h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Preconditions。関数呼び出し時に満たされていると関数が想定する条件。満たさなければ未定義の動作。契約属性の`[[expects]]`に相当">事前条件</a></h2> |
| 229 | +<p><code><a href="../type_traits/decay.html">decay_t</a><F></code>を適用した型を<code>FD</code>、<code><a href="../type_traits/decay.html">decay_t</a><Args>...</code>を適用した型パラメータパックを<code>BoundArgs</code>として</p> |
228 | 230 | <ul>
|
229 |
| -<li><code>FD</code>が<code><a href="../concepts/move_constructible.html">std::move_constructible</a></code>要件を満たすこと</li> |
230 |
| -<li><code>BoundArgs</code>のそれぞれの型<code>Ti</code>が<a href="../type_traits/is_object.html">オブジェクト型</a>である場合、<code><a href="../concepts/move_constructible.html">std::move_constructible</a></code>要件を満たすこと</li> |
| 231 | +<li>(1) : <ul> |
| 232 | +<li><code>FD</code>がCpp17MoveConstructible要件を満たすこと</li> |
| 233 | +<li><code>BoundArgs</code>のそれぞれの型<code>Ti</code>が<a href="../type_traits/is_object.html">オブジェクト型</a>である場合、Cpp17MoveConstructible要件を満たすこと</li> |
| 234 | +</ul> |
| 235 | +</li> |
| 236 | +<li>(2) :<ul> |
| 237 | +<li><code>BoundArgs</code>のそれぞれの型<code>Ti</code>がCpp17MoveConstructible要件を満たすこと</li> |
| 238 | +</ul> |
| 239 | +</li> |
231 | 240 | </ul>
|
232 | 241 | <h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Mandates。満たさなければプログラムが不適格となる要件。この要件は、オーバーロード解決によって選択された関数内での`static_assert`の定数条件式や、関数に対するdelete宣言などで表現できる">適格要件</a></h2>
|
233 | 242 | <ul>
|
234 |
| -<li><code><a href="../type_traits/conjunction.html">conjunction_v</a><<a href="../type_traits/is_constructible.html">is_constructible</a><FD, F>, <a href="../type_traits/is_move_constructible.html">is_move_constructible</a><FD>, <a href="../type_traits/is_constructible.html">is_constructible</a><BoundArgs, Args>..., <a href="../type_traits/is_move_constructible.html">is_move_constructible</a><BoundArgs>...></code>が<code>true</code>であること</li> |
| 243 | +<li>(1) :<ul> |
| 244 | +<li><code><a href="../type_traits/is_constructible.html">is_constructible_v</a><FD, F> && <a href="../type_traits/is_move_constructible.html">is_move_constructible_v</a><FD> && (<a href="../type_traits/is_constructible.html">is_constructible_v</a><BoundArgs, Args> && ...) && (<a href="../type_traits/is_move_constructible.html">is_move_constructible_v</a><BoundArgs> && ...)</code>が<code>true</code>であること</li> |
| 245 | +</ul> |
| 246 | +</li> |
| 247 | +<li>(2) : <code>F</code>を<code>f</code>の型として<ul> |
| 248 | +<li><code>(<a href="../type_traits/is_constructible.html">is_constructible_v</a><BoundArgs, Args> && ...)</code>が<code>true</code>、かつ</li> |
| 249 | +<li><code>(<a href="../type_traits/is_move_constructible.html">is_move_constructible_v</a><BoundArgs> && ...)</code>が<code>true</code>、かつ</li> |
| 250 | +<li>もし<code><a href="../type_traits/is_pointer.html">is_poinetr_v</a><F> || <a href="../type_traits/is_member_pointer.html">is_member_poinetr_v</a><F></code>が<code>true</code>ならば、<code>f != nullptr</code>であること</li> |
| 251 | +</ul> |
| 252 | +</li> |
235 | 253 | </ul>
|
236 | 254 | <h2><a class="cpprefjp-defined-word" data-desc="関数呼び出し式の評価結果となるオブジェクト・値">戻り値</a></h2>
|
237 | 255 | <p>呼び出し可能な<code>f</code>を<code><a href="invoke.html">std::invoke()</a></code>で呼び出した時に必要な引数列に後方一致する<code>f</code>と<code>args...</code>を完全転送して保持し、後から残りの引数リストを渡すことで<code>f</code>を呼び出せる<a class="cpprefjp-defined-word" data-desc="未規定の動作。事前の断りなく処理系によって異なる動作をする" href="../../implementation-compliance.html#dfn-unspecified-behavior">未規定</a>の関数オブジェクトを返す。</p>
|
238 | 256 | <p>返される関数オブジェクトは渡された引数(<code>f, args...</code>)を参照として保持せず、適切にコピー/ムーブして保持する。</p>
|
239 | 257 | <h2><a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a></h2>
|
240 | 258 | <ul>
|
241 |
| -<li>関数オブジェクト<code>f</code>のムーブによって任意の<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>が送出される可能性がある</li> |
| 259 | +<li>(1) : 関数オブジェクト<code>f</code>のムーブによって任意の<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>が送出される可能性がある</li> |
| 260 | +<li>(2) : <code>bound_args</code>の初期化による任意の<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>が送出される可能性がある</li> |
242 | 261 | </ul>
|
243 | 262 | <h2>この機能が必要になった背景・経緯</h2>
|
244 | 263 | <p>C++23で<a href="../ranges/range.html">Rangeアダプタ</a>の<a class="cpprefjp-defined-word" data-desc="プログラム定義。ユーザー(プログラマ)によって定義されること(標準ライブラリで定義されるものを除く)">ユーザー定義</a>がサポートされた。</p>
|
@@ -323,6 +342,10 @@ <h2>参照</h2>
|
323 | 342 | <ul>
|
324 | 343 | <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2387r3.html#nanorange" target="_blank">P2387R3 Pipe support for user-defined range adaptors</a></li>
|
325 | 344 | <li><a href="https://onihusube.hatenablog.com/entry/2022/04/24/010041" target="_blank">rangesのパイプにアダプトするには</a></li>
|
| 345 | +<li><a href="https://open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2714r1.html" target="_blank">P2714R1 Bind front and back to NTTP callables</a><ul> |
| 346 | +<li>C++26で<a class="cpprefjp-defined-word" data-desc="同名の関数を異なる引数・テンプレート・制約などで複数定義すること。または同名の関数の集合">オーバーロード</a>(2)を追加</li> |
| 347 | +</ul> |
| 348 | +</li> |
326 | 349 | </ul></div>
|
327 | 350 |
|
328 | 351 | </div>
|
|
0 commit comments