|
200 | 200 |
|
201 | 201 | <p class="text-right"><small> |
202 | 202 | 最終更新日時(UTC): |
203 | | - <span itemprop="datePublished" content="2026-02-11T06:05:02"> |
204 | | - 2026年02月11日 06時05分02秒 |
| 203 | + <span itemprop="datePublished" content="2026-06-24T02:55:06"> |
| 204 | + 2026年06月24日 02時55分06秒 |
205 | 205 | </span> |
206 | 206 | <br/> |
207 | 207 | <span itemprop="author" itemscope itemtype="http://schema.org/Person"> |
208 | | - <span itemprop="name">yoh</span> |
| 208 | + <span itemprop="name">Akira Takahashi</span> |
209 | 209 | </span> |
210 | 210 | が更新 |
211 | 211 | </small></p> |
@@ -248,6 +248,12 @@ <h2>概要</h2> |
248 | 248 | <li><em>noex</em> が<code>false</code>のとき : <code><a href="../../type_traits/is_invocable_r.html">is_invocable_r_v</a><R, T..., ArgTypes...></code></li> |
249 | 249 | </ul> |
250 | 250 | <p><code>function_ref</code>オブジェクトは、説明専用のメンバ変数<code>thunk-ptr</code>と<code>bound-entity</code>を保持する。</p> |
| 251 | +<p>また、説明専用の変数テンプレート<code>is-convertible-from-specialization<F></code>を次のように定義する。型<code>F</code>が、ある<a class="cpprefjp-defined-word" data-desc="型をconstおよび・もしくはvolatileで修飾すること">CV修飾</a> <em>cv2</em> とnoexcept<a class="cpprefjp-defined-word" data-desc="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態">例外</a>指定 <em>noex2</em> に対する<code>function_ref<R(Args...) /*cv2*/ noexcept(/*noex2*/)></code>の特殊化を表す場合、<code>is-convertible-from-specialization<F></code>は次の値と等しい :</p> |
| 252 | +<p><div class="codehilite"><pre><span></span><code><span class="n"><a href="../../type_traits/is_convertible.html">is_convertible_v</a></span><span class="o"><</span><span class="n">R</span><span class="p">(</span><span class="o">&</span><span class="p">)(</span><span class="n">Args</span><span class="p">...)</span><span class="w"> </span><span class="k">noexcept</span><span class="p">(</span><span class="cm">/*noex2*/</span><span class="p">),</span><span class="w"> </span><span class="n">R</span><span class="p">(</span><span class="o">&</span><span class="p">)(</span><span class="n">Args</span><span class="p">...)</span><span class="w"> </span><span class="k">noexcept</span><span class="p">(</span><span class="cm">/*noex*/</span><span class="p">)</span><span class="o">></span><span class="w"> </span><span class="o">&&</span> |
| 253 | +<span class="n"><a href="../../type_traits/is_convertible.html">is_convertible_v</a></span><span class="o"><</span><span class="kt">int</span><span class="w"> </span><span class="cm">/*cv*/</span><span class="o">&</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="cm">/*cv2*/</span><span class="o">&></span> |
| 254 | +</code></pre></div> |
| 255 | +</p> |
| 256 | +<p>そうでない場合、<code>is-convertible-from-specialization<F></code>は<code>false</code>である。</p> |
251 | 257 | <h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成する要素の1つ。Constraints。関数であればオーバーロード解決に参加するための条件、それ以外であれば受け付ける型の条件">テンプレートパラメータ制約</a></h2> |
252 | 258 | <p><code>function_ref</code>クラステンプレートパラメータの<a class="cpprefjp-defined-word" data-desc="型をconstおよび・もしくはvolatileで修飾すること">CV修飾</a>子 <em>cv</em> に応じて</p> |
253 | 259 | <ul> |
@@ -287,8 +293,9 @@ <h2>効果</h2> |
287 | 293 | <li><a href="op_call.html">関数呼び出し<code>thunk(bound-entity, call-args...)</code></a>は<code><a href="../invoke_r.html">invoke_r</a><R>(f, call-args...)</code>と等価。</li> |
288 | 294 | </ul> |
289 | 295 | </li> |
290 | | -<li>(2) : <code>bound-entity</code>を<code><a href="../../memory/addressof.html">addressof</a>(f)</code>で、<code>thunk-ptr</code>を説明専用の関数<code>thunk</code>へのアドレスで初期化する。<ul> |
| 296 | +<li>(2) : <code>is-convertible-from-specialization<<a href="../../type_traits/remove_cv.html">remove_cv_t</a><T>></code>が<code>false</code>の場合、<code>bound-entity</code>を<code><a href="../../memory/addressof.html">addressof</a>(f)</code>で、<code>thunk-ptr</code>を説明専用の関数<code>thunk</code>へのアドレスで初期化する。<ul> |
291 | 297 | <li><a href="op_call.html">関数呼び出し<code>thunk(bound-entity, call-args...)</code></a>は<code><a href="../invoke_r.html">invoke_r</a><R>(static_cast</*cv*/ T&>(f), call-args...)</code>と等価。</li> |
| 298 | +<li><code>is-convertible-from-specialization<<a href="../../type_traits/remove_cv.html">remove_cv_t</a><T>></code>が<code>true</code>の場合(<code>f</code>が互換するシグニチャ・<a class="cpprefjp-defined-word" data-desc="型をconstおよび・もしくはvolatileで修飾すること">CV修飾</a>をもつ<code>function_ref</code>の特殊化であるとき)、<code>bound-entity</code>を<code>f</code>の<code>bound-entity</code>の値で、<code>thunk-ptr</code>を<code>f</code>の<code>thunk-ptr</code>の値で初期化する。これにより、<code>function_ref</code>から別の<code>function_ref</code>を構築する際に、本来不要な二重の間接呼び出しが回避される。</li> |
292 | 299 | </ul> |
293 | 300 | </li> |
294 | 301 | <li>(3) : <code>bound-entity</code>を<a class="cpprefjp-defined-word" data-desc="未規定の動作。事前の断りなく処理系によって異なる動作をする" href="../../../implementation-compliance.html#dfn-unspecified-behavior">未規定</a>オブジェクトへのポインタまたはヌルポインタで、<code>thunk-ptr</code>を説明専用の関数<code>thunk</code>へのアドレスで初期化する。<ul> |
@@ -386,6 +393,10 @@ <h2>参照</h2> |
386 | 393 | <ul> |
387 | 394 | <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p0792r14.html" target="_blank">P0792R14 <code>function_ref</code>: a type-erased callable reference</a></li> |
388 | 395 | <li><a href="https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3774r1.html" target="_blank">P3774R1 Rename <code>std::nontype</code>, and make it broadly useful</a></li> |
| 396 | +<li><a href="https://open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3961r1.html" target="_blank">P3961R1 Less double indirection in <code>function_ref</code> (RU-220)</a><ul> |
| 397 | +<li>別の<code>function_ref</code>から構築する際の二重の間接呼び出しを回避するため、説明専用の<code>is-convertible-from-specialization</code>を追加し、(2)のコンストラクタの効果を変更した</li> |
| 398 | +</ul> |
| 399 | +</li> |
389 | 400 | </ul></div> |
390 | 401 |
|
391 | 402 | </div> |
|
0 commit comments