6868
6969 </ head >
7070 < body >
71- < header data-kunai-mdinfo ="{"meta": {"header": ["atomic"], "namespace": ["std"], "class": ["atomic_ref"], "id-type": ["function"], "cpp": ["cpp20"]}, "sources": [{"id": "d6af361815015b2cd544f847fdf8bbbdbc17483b", "source": "#include <atomic>\n\nint main()\n{\n int value = 3;\n\n // value\u3092\u53c2\u7167\u3059\u308batomic_ref\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u69cb\u7bc9\n std::atomic_ref<int> a{value};\n\n // \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u306e\u5f15\u6570\u306b\u3088\u3063\u3066\u3001\n // \u30af\u30e9\u30b9\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5f15\u6570\u3092\u63a8\u8ad6 (<int>\u3092\u7701\u7565)\n std::atomic_ref b{value};\n\n // c\u3068b\u3067\u540c\u3058\u5024 (value) \u3092\u53c2\u7167\n std::atomic_ref c = b;\n}\n"}], "page_id": ["reference", "atomic", "atomic_ref", "op_constructor"]} ">
71+ < header data-kunai-mdinfo ="{"meta": {"header": ["atomic"], "namespace": ["std"], "class": ["atomic_ref"], "id-type": ["function"], "cpp": ["cpp20"]}, "sources": [{"id": "d6af361815015b2cd544f847fdf8bbbdbc17483b", "source": "#include <atomic>\n\nint main()\n{\n int value = 3;\n\n // value\u3092\u53c2\u7167\u3059\u308batomic_ref\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u69cb\u7bc9\n std::atomic_ref<int> a{value};\n\n // \u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u306e\u5f15\u6570\u306b\u3088\u3063\u3066\u3001\n // \u30af\u30e9\u30b9\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5f15\u6570\u3092\u63a8\u8ad6 (<int>\u3092\u7701\u7565)\n std::atomic_ref b{value};\n\n // c\u3068b\u3067\u540c\u3058\u5024 (value) \u3092\u53c2\u7167\n std::atomic_ref c = b;\n}\n"}, {"id": "90c7537e3071792c8dd45d7f6ea7b8dbbb0bdd35", "source": "#include <atomic>\n#include <iostream>\n\nint main()\n{\n int value = 3;\n std::atomic_ref<int> a{value};\n\n // \u8aad\u307f\u53d6\u308a\u5c02\u7528\u306eatomic_ref<const int>\u3078\u5909\u63db\u3059\u308b\n std::atomic_ref<const int> b = a;\n\n std::cout << b.load() << std::endl;\n}\n"}], "page_id": ["reference", "atomic", "atomic_ref", "op_constructor"]} ">
7272 < nav class ="navbar navbar-default " role ="navigation ">
7373 < div class ="container-fluid ">
7474 < div class ="navbar-header ">
201201 < p class ="text-right "> < small >
202202 最終更新日時:
203203 < time itemprop ="datePublished " class ="js-local-time "
204- datetime ="2026-08-12T15:34:41 +09:00 ">
205- 2026年08月12日 15時34分41秒 (JST)
204+ datetime ="2026-08-28T11:29:30 +09:00 ">
205+ 2026年08月28日 11時29分30秒 (JST)
206206 </ time >
207207 < br />
208208 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
256256< span class ="k "> constexpr</ span > < span class ="w "> </ span > < span class ="n "> atomic_ref</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="w "> </ span > < span class ="n "> atomic_ref</ span > < span class ="o "> &</ span > < span class ="w "> </ span > < span class ="n "> other</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="k "> noexcept</ span > < span class ="p "> ;</ span > < span class ="w "> </ span > < span class ="c1 "> // (2) C++26</ span >
257257
258258< span class ="k "> explicit</ span > < span class ="w "> </ span > < span class ="n "> atomic_ref</ span > < span class ="p "> (</ span > < span class ="n "> T</ span > < span class ="o "> &&</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="k "> delete</ span > < span class ="p "> ;</ span > < span class ="w "> </ span > < span class ="c1 "> // (3) C++26</ span >
259+
260+ < span class ="k "> template</ span > < span class ="w "> </ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> U</ span > < span class ="o "> ></ span >
261+ < span class ="k "> constexpr</ span > < span class ="w "> </ span > < span class ="n "> atomic_ref</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="w "> </ span > < span class ="n "> atomic_ref</ span > < span class ="o "> <</ span > < span class ="n "> U</ span > < span class ="o "> >&</ span > < span class ="w "> </ span > < span class ="n "> other</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="k "> noexcept</ span > < span class ="p "> ;</ span > < span class ="w "> </ span > < span class ="c1 "> // (4) C++26</ span >
259262</ code > </ pre > </ div >
260263</ p >
261264< h2 > 概要</ h2 >
262265< ul >
263266< li > (1) : < code > obj</ code > を参照して< code > *this</ code > にポインタとして保持する</ li >
264267< li > (2) : コピーコンストラクタ。< code > other</ code > が参照するオブジェクトを< code > *this</ code > もまた参照する</ li >
265268< li > (3) : 一時オブジェクト(右辺値)を参照する< code > atomic_ref</ code > が構築されるのを防ぐため、< code > delete</ code > 定義されている</ li >
269+ < li > (4) : 変換コンストラクタ。< a class ="cpprefjp-defined-word " data-desc ="型をconstおよび・もしくはvolatileで修飾すること "> CV修飾</ a > のみが異なる< code > atomic_ref<U></ code > から構築し、< code > other</ code > が参照するオブジェクトを< code > *this</ code > もまた参照する</ li >
270+ </ ul >
271+ < h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Constraints。関数であればオーバーロード解決に参加するための条件、それ以外であれば受け付ける型の条件 "> テンプレートパラメータ制約</ a > </ h2 >
272+ < ul >
273+ < li > (4) : < code > T</ code > と< code > U</ code > が類似の型 (similar type) であり、< code > < a href ="../../type_traits/is_convertible.html "> is_convertible_v</ a > <U*, T*></ code > が< code > true</ code > であること< ul >
274+ < li > 類似の型とは、< a class ="cpprefjp-defined-word " data-desc ="型をconstおよび・もしくはvolatileで修飾すること "> CV修飾</ a > を除いて同じ型であることをいう。つまり< code > atomic_ref<int></ code > から< code > atomic_ref<const int></ code > のように、< a class ="cpprefjp-defined-word " data-desc ="型をconstおよび・もしくはvolatileで修飾すること "> CV修飾</ a > を加える方向にのみ変換できる</ li >
275+ </ ul >
276+ </ li >
266277</ ul >
267278< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Preconditions。関数呼び出し時に満たされていると関数が想定する条件。満たさなければ未定義の動作。契約属性の`[[expects]]`に相当 "> 事前条件</ a > </ h2 >
268279< ul >
269280< li > 参照するオブジェクトがメンバ定数のアライメント値< code > required_alignment</ code > にアライメントされていること</ li >
270281</ ul >
271282< h2 > < a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > </ h2 >
272283< p > 投げない</ p >
284+ < h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Postconditions。関数を実行後に満たされている条件。契約属性の`[[ensures]]`に相当 "> 事後条件</ a > </ h2 >
285+ < ul >
286+ < li > (4) : < code > *this</ code > は、< code > other</ code > が参照しているオブジェクトを参照する</ li >
287+ </ ul >
273288< h2 > 備考</ h2 >
274289< ul >
275290< li > デフォルトコンストラクタは定義されない</ li >
276291</ ul >
277292< h2 > 例</ h2 >
293+ < h3 > 基本的な使い方</ h3 >
278294< p > < div class ="yata " id ="d6af361815015b2cd544f847fdf8bbbdbc17483b "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../../atomic.html "> <atomic></ a > </ span >
279295
280296< span class ="kt "> int</ span > < span class ="w "> </ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span >
@@ -293,8 +309,27 @@ <h2>例</h2>
293309< span class ="p "> }</ span >
294310</ code > </ pre > </ div >
295311</ div > </ p >
296- < h3 > 出力</ h3 >
312+ < h4 > 出力</ h4 >
297313< p > < pre > < code > </ code > </ pre > </ p >
314+ < h3 > < a class ="cpprefjp-defined-word " data-desc ="型をconstおよび・もしくはvolatileで修飾すること "> CV修飾</ a > の異なる< code > atomic_ref</ code > へ変換する (C++26)</ h3 >
315+ < p > < div class ="yata " id ="90c7537e3071792c8dd45d7f6ea7b8dbbb0bdd35 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../../atomic.html "> <atomic></ a > </ span >
316+ < span class ="cp "> #include < a href ="../../iostream.html "> <iostream></ a > </ span >
317+
318+ < span class ="kt "> int</ span > < span class ="w "> </ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span >
319+ < span class ="p "> {</ span >
320+ < span class ="w "> </ span > < span class ="kt "> int</ span > < span class ="w "> </ span > < span class ="n "> value</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="mi "> 3</ span > < span class ="p "> ;</ span >
321+ < span class ="w "> </ span > < span class ="n "> std</ span > < span class ="o "> ::</ span > < span class ="n "> atomic_ref</ span > < span class ="o "> <</ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="w "> </ span > < span class ="n "> a</ span > < span class ="p "> {</ span > < span class ="n "> value</ span > < span class ="p "> };</ span >
322+
323+ < span class ="w "> </ span > < span class ="c1 "> // 読み取り専用のatomic_ref<const int>へ変換する</ span >
324+ < span class ="w "> </ span > < span class ="n "> std</ span > < span class ="o "> ::</ span > < span class ="n "> atomic_ref</ span > < span class ="o "> <</ span > < span class ="k "> const</ span > < span class ="w "> </ span > < span class ="kt "> int</ span > < span class ="o "> ></ span > < span class ="w "> </ span > < span class ="n "> b</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> a</ span > < span class ="p "> ;</ span >
325+
326+ < span class ="w "> </ span > < span class ="n "> < a href ="../../iostream/cout.html "> std::cout</ a > </ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> b</ span > < span class ="p "> .</ span > < span class ="n "> load</ span > < span class ="p "> ()</ span > < span class ="w "> </ span > < span class ="o "> <<</ span > < span class ="w "> </ span > < span class ="n "> < a href ="../../ostream/endl.html "> std::endl</ a > </ span > < span class ="p "> ;</ span >
327+ < span class ="p "> }</ span >
328+ </ code > </ pre > </ div >
329+ </ div > </ p >
330+ < h4 > 出力</ h4 >
331+ < p > < pre > < code > 3
332+ </ code > </ pre > </ p >
298333< h2 > バージョン</ h2 >
299334< h3 > 言語</ h3 >
300335< ul >
@@ -317,6 +352,10 @@ <h2>参照</h2>
317352< li > C++26で、一時オブジェクト(右辺値)からの構築を禁止する< code > delete</ code > 定義されたコンストラクタ (3) が追加された</ li >
318353</ ul >
319354</ li >
355+ < li > < a href ="https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3860r1.html " target ="_blank "> P3860R1 Proposed Resolution for NB Comment GB13-309 < code > atomic_ref<T></ code > is not convertible to < code > atomic_ref<const T></ code > </ a > < ul >
356+ < li > C++26で、< a class ="cpprefjp-defined-word " data-desc ="型をconstおよび・もしくはvolatileで修飾すること "> CV修飾</ a > のみが異なる< code > atomic_ref</ code > から構築する変換コンストラクタ (4) が追加された。C++26で< a class ="cpprefjp-defined-word " data-desc ="型をconstおよび・もしくはvolatileで修飾すること "> CV修飾</ a > された型に対応した際 (P3323R1) に、この変換が考慮されていなかったことへの対応</ li >
357+ </ ul >
358+ </ li >
320359</ ul > </ div >
321360
322361 </ div >
0 commit comments