cpprefjp - C++日本語リファレンス 2026-03-16T15:42:08.517205 b9f28747-7a6a-428e-8cd2-fe7cc8699b63 コンパイラの実装状況 -- Update index access for parameter packs in status for Clang 5486a04cdd25de7f357d440ea8c94c661e10c65a:implementation-status.md 2026-03-13T11:30:31+09:00 <h1 itemprop="name"><span class="token">コンパイラの実装状況</span></h1> <div itemprop="articleBody"><p>このページでは、C++のバージョンごとの言語機能を、どのコンパイラがどのバージョンからサポートしているかをまとめる。</p> <p>ライブラリ機能については、本サイトのリファレンスで各機能を参照してもらいたい。</p> <ul> <li><a href="#cpp11">C++11</a></li> <li><a href="#cpp14">C++14</a></li> <li><a href="#cpp17">C++17</a></li> <li><a href="#cpp20">C++20</a></li> <li><a href="#cpp23">C++23</a></li> <li><a href="#cpp26">C++26</a></li> </ul> <h2><a href="#cpp11" id="cpp11">C++11言語機能の実装状況</a></h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> <th><a href="implementation.html#gcc">GCC</a></th> <th><a href="implementation.html#clang">Clang</a></th> <th><a href="implementation.html#icc">ICC</a></th> <th><a href="implementation.html#visual_cpp">MSVC</a></th> </tr> </thead> <tbody> <tr> <td>N2341: <code><a href="lang/cpp11/alignas.html">alignas</a></code></td> <td>アライメント指定</td> <td>4.8</td> <td>3.0</td> <td>15.0</td> <td>2015<br />2003あるいはそれ以前からある<code>__declspec(align(x))</code>構文で代替可能。</td> </tr> <tr> <td>N2341: <code><a href="lang/cpp11/alignof.html">alignof</a></code></td> <td>アライメント取得</td> <td>4.5</td> <td>3.3</td> <td>15.0</td> <td>2015<br />2003あるいはそれ以前よりある<code>__alignof</code>で代替可能。</td> </tr> <tr> <td>N1984: <a href="lang/cpp11/auto.html">変数の型推論のためのauto</a></td> <td>型推論</td> <td>4.4</td> <td>2.9</td> <td>12.0</td> <td>2010</td> </tr> <tr> <td>N2343: <code><a href="lang/cpp11/decltype.html">decltype</a></code></td> <td>式の型を取得</td> <td>4.3</td> <td>2.9</td> <td>13.0</td> <td>2010 (partial)<br /> 2012</td> </tr> <tr> <td>N1653: C99互換のプリプロセッサ</td> <td><a href="lang/cpp11/variadic_macros.html">可変引数マクロ</a>、<a href="lang/cpp11/pragma_operator.html">Pragma演算子</a>、<code><a href="lang/cpp11/func.html">__func__</a></code></td> <td>4.3</td> <td>2.9</td> <td>11.1</td> <td>2005 (partial): 可変引数のみ <code>_Pragma</code>の代わりに<code>__pragma</code>が存在する。<br /> 2019 Update 6</td> </tr> <tr> <td>N2235: <code><a href="lang/cpp11/constexpr.html">constexpr</a></code></td> <td>定数式</td> <td>4.6</td> <td>3.1</td> <td>13.0 (partial)<br /> 14.0</td> <td>2015 (partial)<br /> 2015 Update 1</td> </tr> <tr> <td>N2346: <a href="lang/cpp11/defaulted_and_deleted_functions.html">関数の<code>default/delete</code>宣言</a></td> <td>自動定義される特殊関数の制御</td> <td>4.4</td> <td>3.0</td> <td>12.0</td> <td>2013: ムーブコンストラクタ・ムーブ代入演算子の<code>default</code>は不可<br /> 2015</td> </tr> <tr> <td>N1986: <a href="lang/cpp11/delegating_constructors.html">委譲コンストラクタ</a></td> <td>コンストラクタから他のコンストラクタに処理を委譲する</td> <td>4.7</td> <td>3.0</td> <td>14.0</td> <td>2013</td> </tr> <tr> <td>N2437: <a href="lang/cpp11/explicit_conversion_operator.html">明示的な型変換演算子のオーバーロード</a></td> <td>明示的な型変換が行われる場合にのみ呼び出される演算子をオーバーロードできるようにする</td> <td>4.5</td> <td>3.0</td> <td>14.0</td> <td>2013</td> </tr> <tr> <td>N1791: <a href="lang/cpp11/extend_friend_targets.html"><code>friend</code>宣言できる対象を拡張</a></td> <td>テンプレートパラメータや型の別名を<code>friend</code>宣言</td> <td>4.7</td> <td>2.9</td> <td>11.1 (partial) <br /> 12.0</td> <td>2010</td> </tr> <tr> <td>N1987: <code><a href="lang/cpp11/extern_template.html">extern template</a></code></td> <td>テンプレートのインスタンス化抑止</td> <td>3.3</td> <td>2.9</td> <td>11.1</td> <td>6.0</td> </tr> <tr> <td>N2540: <a href="lang/cpp11/inheriting_constructors.html">継承コンストラクタ</a></td> <td>基底クラスのコンストラクタを継承する</td> <td>4.8</td> <td>3.3</td> <td>15.0</td> <td>2015</td> </tr> <tr> <td>N2927: <a href="lang/cpp11/lambda_expressions.html">ラムダ式</a></td> <td>関数オブジェクトをその場に書く</td> <td>4.5</td> <td>3.1</td> <td>12.0</td> <td>2010 (partial)<br /> 2012</td> </tr> <tr> <td>N2657: <a href="lang/cpp11/local_and_unnamed_type_as_template_arguments.html">ローカル型と無名型を、テンプレート引数として使用することを許可</a></td> <td>ローカルおよび無名として定義したクラスや列挙型を、テンプレート引数として渡せるようにする</td> <td>4.5</td> <td>2.9</td> <td>12.0</td> <td>2010</td> </tr> <tr> <td>N1811: <a href="lang/cpp11/long_long_type.html"><code>long long</code>型</a></td> <td>64ビット以上の大きさを持つ整数型</td> <td>4.3</td> <td>2.9</td> <td>11.1</td> <td>2003</td> </tr> <tr> <td>N2535: <a href="lang/cpp11/inline_namespaces.html">インライン名前空間</a></td> <td>ネストした名前空間に、透過的にアクセスする</td> <td>4.4</td> <td>2.9</td> <td>14.0</td> <td>2015</td> </tr> <tr> <td>N2249: <a href="lang/cpp11/char16_32.html"><code>char16_t</code>と<code>char32_t</code></a></td> <td>UTF-16とUTF-32の文字型</td> <td>4.4</td> <td>2.9</td> <td>12.1 (Windows: partial) <br /> 12.1 (GNU/Linux, macOS)<br /> 14.0</td> <td>2015<br /> 2010より組み込み型ではなく型の別名として存在する</td> </tr> <tr> <td>N2442: <a href="lang/cpp11/utf8_string_literals.html">UTF-8文字列リテラル</a></td> <td><code>char</code>の文字列をUTF-8エンコーディングするプレフィックス</td> <td>4.5</td> <td>3.0</td> <td>12.1 (Windows: partial) <br /> 12.1 (GNU/Linux, macOS)<br /> 14.0</td> <td>2015</td> </tr> <tr> <td>N2442: <a href="lang/cpp11/raw_string_literals.html">生文字列リテラル</a></td> <td>文字列リテラルにRプレフィックスを付けることで、エスケープシーケンスを無視する</td> <td>4.5</td> <td>3.0</td> <td>14.0</td> <td>2013</td> </tr> <tr> <td>N2765: <a href="lang/cpp11/user_defined_literals.html">ユーザー定義リテラル</a></td> <td>リテラルのサフィックスをユーザー定義する</td> <td>4.7</td> <td>3.1</td> <td>15.0</td> <td>2015</td> </tr> <tr> <td>N2541: <a href="lang/cpp11/trailing_return_types.html">戻り値の型を後置する関数宣言構文</a></td> <td>以下のような形式での関数宣言<br /> <code>auto f(arg_types...) -&gt; return_type</code></td> <td>4.4</td> <td>2.9</td> <td>12.0</td> <td>2010</td> </tr> <tr> <td>N2431: <code><a href="lang/cpp11/nullptr.html">nullptr</a></code></td> <td>ヌルポインタを表すポインタリテラル</td> <td>4.6</td> <td>3.0</td> <td>11.1</td> <td>2010</td> </tr> <tr> <td>N1757: <a href="lang/cpp11/right_angle_brackets.html">テンプレートでの連続した右山カッコを許可</a></td> <td><code>vector&lt;basic_string&lt;char&gt;&gt;</code>のように、<code>&gt;&gt;</code>をスペースを空けずに記述可能にする</td> <td>4.3</td> <td>2.9</td> <td>11.1</td> <td>2005</td> </tr> <tr> <td>N2118: <a href="lang/cpp11/rvalue_ref_and_move_semantics.html">右辺値参照・ムーブセマンティクス</a></td> <td>右辺値によるオーバーロード、およびそれによるリソースの所有権移動</td> <td>4.3 (partial)<br /> 4.6</td> <td>2.9</td> <td>12.0</td> <td>2010 (partial) ムーブコンストラクタと代入演算子の暗黙定義に対応していない。<br /> 2015</td> </tr> <tr> <td>N1720: <a href="lang/cpp11/static_assert.html">コンパイル時アサート</a></td> <td>コンパイル時に条件式が真であることを表明する</td> <td>4.3</td> <td>2.9</td> <td>11.1</td> <td>2010</td> </tr> <tr> <td>N2347: <a href="lang/cpp11/scoped_enum.html#extended-unscoped-enum"><code>enum</code>の先行宣言</a></td> <td></td> <td>4.6</td> <td>3.1</td> <td>11.1 (partial)<br /> 14.0</td> <td>2012</td> </tr> <tr> <td>N2347: <a href="lang/cpp11/scoped_enum.html">スコープを持つ列挙型</a></td> <td>強い型付けとスコープを持つ列挙型</td> <td>4.4</td> <td>2.9</td> <td>11.1 (partial)<br /> 14.0</td> <td>2012</td> </tr> <tr> <td>N2258: <a href="lang/cpp11/alias_templates.html">エイリアステンプレート</a></td> <td>テンプレートによって型の別名を定義する</td> <td>4.7</td> <td>3.0</td> <td>12.1</td> <td>2013</td> </tr> <tr> <td>N2544: <a href="lang/cpp11/unrestricted_unions.html">共用体でクラスオブジェクトをもつことを許可</a></td> <td>共用体のメンバ変数として、クラスオブジェクトを持つ</td> <td>4.6</td> <td>3.1</td> <td>14.0(Linux系OSおよびMacのみ。Windowsは非対応)</td> <td>2015</td> </tr> <tr> <td>N2242: <a href="lang/cpp11/variadic_templates.html">可変引数テンプレート</a></td> <td>任意の数のテンプレートパラメータを受け取れるようにする</td> <td>4.3 (partial)<br /> 4.4</td> <td>2.9</td> <td>12.1</td> <td>2013</td> </tr> <tr> <td>N2930: <a href="lang/cpp11/range_based_for.html">範囲for文</a></td> <td>配列やコンテナといった範囲を表すオブジェクトを、簡潔に走査する</td> <td>4.6</td> <td>3.0</td> <td>13.0</td> <td>2012</td> </tr> <tr> <td>N2928: <a href="lang/cpp11/override_final.html"><code>override</code>と<code>final</code></a></td> <td>メンバ関数のオーバーライド指定、および派生クラスでのオーバーロードを禁止する指定</td> <td>4.7</td> <td>2.9</td> <td>14.0</td> <td>2005 (partial): <code>override</code>のみ。<code>final</code>の代わりにsealedが存在する。ただし両者ともデストラクタには指定できない。<br /> 2012</td> </tr> <tr> <td>N2761: <a href="lang/cpp11/attributes.html">属性構文</a></td> <td><code>[[attr]]</code>構文による、クラス、関数、変数の属性指定</td> <td>4.8</td> <td>3.3</td> <td>12.1</td> <td>2015</td> </tr> <tr> <td>N2439: <a href="lang/cpp11/ref_qualifier_for_this.html">メンバ関数の左辺値/右辺値修飾</a></td> <td>オブジェクトが左辺値/右辺値の場合のみ呼び出し可能であることの指定</td> <td>4.8.1</td> <td>2.9</td> <td>14.0</td> <td>2015</td> </tr> <tr> <td>N2756: <a href="lang/cpp11/non_static_data_member_initializers.html">非静的メンバ変数の初期化</a></td> <td>メンバ変数を、宣言と同時に初期値指定する</td> <td>4.7</td> <td>3.0</td> <td>14.0</td> <td>2013</td> </tr> <tr> <td>N2672: <a href="lang/cpp11/initializer_lists.html">初期化子リスト</a></td> <td>波カッコによる初期化をユーザー定義する。<code>vector&lt;int&gt; v = {1, 2, 3};</code>など。</td> <td>4.4</td> <td>3.1</td> <td>14.0</td> <td>2013</td> </tr> <tr> <td>N2672: <a href="lang/cpp11/uniform_initialization.html">一様初期化</a></td> <td>コンストラクタ呼び出しを波カッコで行う。 <code>T x { a, b, c };</code></td> <td>4.4</td> <td>3.1</td> <td>13.0(partial)<br /> 14.0</td> <td>2013</td> </tr> <tr> <td>N3050: <code><a href="lang/cpp11/noexcept.html">noexcept</a></code></td> <td>関数の例外指定、例外を投げる可能性のある式かbool値を返す演算子</td> <td>4.6</td> <td>3.0</td> <td>13.0(partial)<br />14.0</td> <td>2015</td> </tr> <tr> <td>N2634: <a href="lang/cpp11/sfinae_expressions.html">任意の式によるSFINAE</a></td> <td>特定の式が有効かどうかで、その関数をオーバーロード解決に含めるかどうかを決定する</td> <td>4.4</td> <td>2.9</td> <td>12.0</td> <td>2015 Update 1 (partial)<br /> 2017 Update 7</td> </tr> <tr> <td>N2659: <a href="lang/cpp11/thread_local_storage.html">スレッドローカルストレージ</a></td> <td>スレッドごとに異なる静的記憶域に保持される変数</td> <td>4.8</td> <td>3.3</td> <td>11.1 (partial)</td> <td>2010<br /> <code>__declspec(thread)</code>属性での部分サポート<br /> 2015</td> </tr> <tr> <td>N2660: <a href="lang/cpp11/static_initialization_thread_safely.html">ブロックスコープを持つ<code>static</code>変数初期化のスレッドセーフ化</a></td> <td>関数ローカルで定義した<code>static</code>変数の初期化を、スレッドセーフにする</td> <td>4.3</td> <td>2.9</td> <td>11.0 (Lnux/macOS)<br /> 14.0</td> <td>2015</td> </tr> </tbody> </table> <p>各処理系のC++11実装状況ページ:</p> <ul> <li>全体的な対応状況: <a href="http://web.archive.org/web/20160327011707/https://wiki.apache.org/stdcxx/C++0xCompilerSupport" target="_blank">C++0xCompilerSupport</a></li> <li>GCC: <a href="https://gcc.gnu.org/projects/cxx-status.html#cxx11" target="_blank">C++11 Support in GCC</a></li> <li>libstdc++ : <a href="https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011" target="_blank">C++ 2011</a></li> <li>Clang: <a href="http://clang.llvm.org/cxx_status.html" target="_blank">C++98 and C++11 Support in Clang</a><ul> <li><a href="http://clang.llvm.org/cxx_dr_status.html" target="_blank">C++ Defect Report Support in Clang</a></li> </ul> </li> <li>ICC : <a href="https://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler" target="_blank">C++11 Features Supported by Intel® C++ Compiler</a></li> <li>Visual C++ (MSVC):<ul> <li><a href="https://docs.microsoft.com/ja-jp/cpp/visual-cpp-language-conformance" target="_blank">Visual C++ 言語への準拠</a></li> <li><a href="https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/" target="_blank">Announcing: MSVC Conforms to the C++ Standard</a></li> </ul> </li> </ul> <h2><a href="#cpp14" id="cpp14">C++14言語機能の実装状況</a></h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> <th><a href="implementation.html#gcc">GCC</a></th> <th><a href="implementation.html#clang">Clang</a></th> <th><a href="implementation.html#icc">ICC</a></th> <th><a href="implementation.html#visual_cpp">MSVC</a></th> </tr> </thead> <tbody> <tr> <td>N3472: <a href="lang/cpp14/binary_literals.html">2進数リテラル</a></td> <td>2進数を表す<code>0b</code> or <code>0B</code>プレフィックスを付けた数値リテラルの記述を可能とする</td> <td>4.3(GNU)<br /> 4.9</td> <td>2.9</td> <td>11.0</td> <td>2015</td> </tr> <tr> <td>N3638: <a href="lang/cpp14/return_type_deduction_for_normal_functions.html">通常関数の戻り値型推論</a></td> <td>関数の戻り値型を<code>auto</code>にすることで、<code>return</code>文から戻り値の型を推論させる</td> <td>4.8(partial)<br />4.9</td> <td>3.3(partial)<br /> 3.4</td> <td>15.0</td> <td>2015</td> </tr> <tr> <td>N3648: <a href="lang/cpp14/initialize_capture.html">ラムダ式の初期化キャプチャ</a></td> <td>キャプチャに代入構文を導入し、一つの変数に複数のキャプチャ方法を指定可能にする</td> <td>4.9</td> <td>3.4</td> <td>15.0</td> <td>2015</td> </tr> <tr> <td>N3649: <a href="lang/cpp14/generic_lambdas.html">ジェネリックラムダ</a></td> <td>ラムダ式のパラメータを<code>auto</code>にすることで、ジェネリックな関数呼び出し演算子を持つ関数オブジェクトを生成する</td> <td>4.9</td> <td>3.4</td> <td>16.0</td> <td>2015</td> </tr> <tr> <td>N3651: <a href="lang/cpp14/variable_templates.html">変数テンプレート</a></td> <td>変数定義時のテンプレート指定を可能にする。</td> <td>5.1</td> <td>3.4</td> <td>16.0</td> <td>2015 Update 2</td> </tr> <tr> <td>N3652: <a href="lang/cpp14/relaxing_constraints_on_constexpr.html"><code>constexpr</code>関数内での条件分岐とループの文を許可</a></td> <td><code>if</code>文、<code>switch</code>文による条件分岐の許可。<br /><code>for</code>文、<code>while</code>文、<code>do-while</code>文によるループの許可。<br /><code>void</code>戻り値型の許可<br />初期化を伴う変数宣言の許可。<br />変数書き換えの許可。</td> <td>5.1</td> <td>3.3(partial) <br /> 3.4</td> <td>16.0</td> <td>2017</td> </tr> <tr> <td>N3653: <a href="lang/cpp14/brace_elision_in_array_temporary_initialization.html">宣言時のメンバ初期化を持つ型の集成体初期化を許可</a></td> <td>一様初期化と初期化子リストを組み合わせた際、二重に波カッコが必要となっていた仕様を緩和し、波カッコを省略できるようにする</td> <td>5.1</td> <td>3.3</td> <td>16.0</td> <td>2017</td> </tr> <tr> <td>N3760: <a href="lang/cpp14/deprecated_attr.html"><code>[[deprecated]]</code>属性</a></td> <td>非推奨の機能であることを示す属性。</td> <td>4.9</td> <td>3.4</td> <td>15.0<br /> (Linux/Mac OS)</td> <td>2015<br />それ以前は<code>__declspec(deprecated)</code>で代替可能</td> </tr> <tr> <td>N3781: <a href="lang/cpp14/digit_separators.html">数値リテラルの桁区切り文字</a></td> <td>シングルクォーテーションで数値リテラルを桁区切りする。</td> <td>4.9</td> <td>3.4</td> <td>16.0</td> <td>2015</td> </tr> <tr> <td>N3778: <a href="lang/cpp14/sized_deallocation.html">サイズ付きデアロケーション</a></td> <td>サイズをとる<code>delete</code>演算子のオーバーロードを許可する。</td> <td>5.1</td> <td>3.4</td> <td>16.0</td> <td>2015</td> </tr> </tbody> </table> <p>各処理系のC++14実装状況ページ:</p> <ul> <li>GCC: <a href="https://gcc.gnu.org/projects/cxx-status.html#cxx14" target="_blank">C++14 Support in GCC</a></li> <li>libstdc++: <a href="https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014" target="_blank">C++ 2014</a></li> <li>Clang: <a href="http://clang.llvm.org/cxx_status.html" target="_blank">C++98, C++11, and C++14 Support in Clang</a></li> <li>Visual C++ (MSVC):<ul> <li><a href="https://docs.microsoft.com/ja-jp/cpp/visual-cpp-language-conformance" target="_blank">Visual C++ 言語への準拠</a></li> <li><a href="https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/" target="_blank">Announcing: MSVC Conforms to the C++ Standard</a></li> </ul> </li> <li>ICC: <a href="https://software.intel.com/en-us/articles/c14-features-supported-by-intel-c-compiler" target="_blank">C++14 Features Supported by Intel C++ Compiler</a><ul> <li><a href="https://software.intel.com/en-us/forums/topic/549502" target="_blank">Intel (R) Parallel Studio XE 2016 Beta program has begun</a></li> </ul> </li> </ul> <h2><a href="#cpp17" id="cpp17">C++17言語機能の実装状況</a></h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> <th><a href="implementation.html#gcc">GCC</a></th> <th><a href="implementation.html#clang">Clang</a></th> <th><a href="implementation.html#icc">ICC</a></th> <th><a href="implementation.html#visual_cpp">MSVC</a></th> </tr> </thead> <tbody> <tr> <td>N3928: <a href="lang/cpp17/extending_static_assert.html">メッセージなしの<code>static_assert</code></a></td> <td>デフォルトの表明メッセージを使用する</td> <td>6</td> <td>3.5</td> <td>18.0</td> <td>2017</td> </tr> <tr> <td>N4086: <a href="lang/cpp17/removing_trigraphs.html">トライグラフを削除</a></td> <td></td> <td>5.1</td> <td>3.5</td> <td>19.1</td> <td>2010</td> </tr> <tr> <td>N4051: <a href="lang/cpp17/allow_typename_in_a_template_template_parameter.html">テンプレートテンプレートパラメータに<code>typename</code>を許可</a></td> <td><code>class</code>キーワードしか使用できなかった部分に、<code>typename</code>を許可</td> <td>5.0</td> <td>3.5</td> <td>17.0</td> <td>2015</td> </tr> <tr> <td>N3922: <a href="lang/cpp17/new_rules_for_auto_deduction_from_braced-init-list.html">単一要素の波カッコ初期化を非配列とする</a></td> <td><code>initializer_list&lt;T&gt;</code>だったのを<code>T</code>に変更</td> <td>5</td> <td>3.8</td> <td>17.0</td> <td>2015</td> </tr> <tr> <td>N4295: <a href="lang/cpp17/folding_expressions.html">畳み込み式</a></td> <td>パラメータパックに対する2項演算の集積処理</td> <td>6</td> <td>3.6</td> <td>19.0</td> <td>2017 Update 5</td> </tr> <tr> <td>N4267: <a href="lang/cpp17/utf8_character_literals.html">UTF-8文字リテラル</a></td> <td>文字列リテラルだけでなく、文字リテラルにもUTF-8指定できるようにする</td> <td>6</td> <td>3.6</td> <td>17.0</td> <td>2015</td> </tr> <tr> <td>N4230: <a href="lang/cpp17/nested_namespace.html">入れ子名前空間の定義</a></td> <td><code>namespace A::B {}</code>のように、入れ子の名前空間を簡単に定義できるようにする</td> <td>6</td> <td>3.6</td> <td>17.0</td> <td>2015 Update 3</td> </tr> <tr> <td>N4266: <a href="lang/cpp17/attributes_for_namespaces_and_enumerators.html">名前空間と列挙子に属性の付加を許可</a></td> <td>名前空間の定義と、列挙型の各要素の定義に、属性を付けられるようにする</td> <td>名前空間は4.0<br />列挙子は6</td> <td>3.6</td> <td>17.0</td> <td>2015</td> </tr> <tr> <td>N4268: <a href="lang/cpp17/allow_constant_evaluation_for_all_non-type_template_arguments.html">全ての非型テンプレート引数の定数式評価を許可</a></td> <td>ポインタの定数式評価として、配列からポインタへの変換や、関数から関数ポインタへの変換などを許可</td> <td>6</td> <td>3.6</td> <td>19.1</td> <td>2017 Update 5</td> </tr> <tr> <td>P0001R1: <a href="lang/cpp17/remove_deprecated_use_of_the_register_keyword.html">非推奨だった<code>register</code>キーワードを削除</a></td> <td></td> <td>7</td> <td>3.8</td> <td>18.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0002R1: <a href="lang/cpp17/remove_deprecated_increment_of_bool.html">非推奨だった<code>bool</code>型オブジェクトに対するインクリメントの仕様を削除</a></td> <td></td> <td>7</td> <td>3.8</td> <td>18.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0012R1: <a href="lang/cpp17/exception_spec_be_part_of_the_type_system.html">例外仕様を型システムの一部にする</a></td> <td></td> <td>7</td> <td>4</td> <td>18.0</td> <td>2017 Update 5</td> </tr> <tr> <td>P0061R1: <a href="lang/cpp17/has_include.html">プリプロセッサでの条件式<code>__has_include</code></a></td> <td>対象のインクルードファイルが存在するかをプリプロセス時に判定する</td> <td>5.0</td> <td>3.0</td> <td>18.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0136R1: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0136r1.html" target="_blank">継承コンストラクタの新仕様</a></td> <td>デフォルト引数を引き継ぐようにした</td> <td>7</td> <td>3.9</td> <td>No</td> <td>2017 Update 7</td> </tr> <tr> <td>P0188R1: <a href="lang/cpp17/fallthrough.html"><code>[[fallthrough]]</code>属性</a></td> <td><code>case</code>節で<code>break</code>や<code>return</code>を書かなかった場合に、それが意図したフォールスルーであることをコンパイラに伝える属性</td> <td>7</td> <td>3.9</td> <td>18.0</td> <td>2017</td> </tr> <tr> <td>P0189R1: <a href="lang/cpp17/nodiscard.html"><code>[[nodiscard]]</code>属性</a></td> <td>関数の戻り値を無視してはならないことをユーザーに伝える属性</td> <td>4.8からは<code>[[gnu::warn_unused_result]]</code>を使用すること<br /> 7からサポート</td> <td>3.9</td> <td>18.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0212R1: <a href="lang/cpp17/maybe_unused.html"><code>[[maybe_unused]]</code>属性</a></td> <td>使用しない可能性がある変数であることをコンパイラに伝える属性</td> <td>4.8からは<code>[[gnu::unused]]</code>を使用すること<br /> 7からサポート</td> <td>3.9</td> <td>18.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0017R1: <a href="lang/cpp17/extension_to_aggregate_initialization.html">基底クラスのメンバ変数を集成体初期化するための波カッコを省略できるようにする</a></td> <td>基底クラスのメンバを集成体初期化するために、<code>derived d {{42}};</code>の代わりに<code>derived d {42};</code>と書けるようにする</td> <td>7</td> <td>3.9</td> <td>19.1</td> <td>2017 Update 7</td> </tr> <tr> <td>P0170R1: <a href="lang/cpp17/constexpr_lambda.html">ラムダ式を<code>constexpr</code>として使用できるようにする</a></td> <td>ラムダ式の関数オブジェクトが定数式の文脈で使用された場合に、それがコンパイル時に評価されるようにする</td> <td>7</td> <td>5</td> <td>19.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0184R0: <a href="lang/cpp17/generalizing_the_range-based_for_loop.html">範囲for文のイテレータ型が一致しないことを許可</a></td> <td><code>begin()</code>と<code>end()</code>が異なるイテレータ型を返せるようにすることで、終端イテレータを定義しやすくする</td> <td>6</td> <td>3.9</td> <td>18.0</td> <td>2017</td> </tr> <tr> <td>P0018R3: <a href="lang/cpp17/lambda_capture_of_this_by_value.html">ラムダ式での<code>*this</code>のコピーキャプチャ</a></td> <td>キャプチャリストに<code>*this</code>を指定することで、<code>*this</code>をコピーキャプチャする</td> <td>7</td> <td>3.9</td> <td>19.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0138R2: <a href="lang/cpp17/construction_enum_class_values.html"><code>enum class</code>変数の初期値として整数を指定する際の規則を調整</a></td> <td>キャストを使用することなく整数を初期値として使用し、<code>E e{0};</code>のような初期化を許可</td> <td>7</td> <td>3.9</td> <td>19.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0245R1: <a href="lang/cpp17/hexadecimal_floating_literals.html">16進浮動小数点数リテラル</a></td> <td><code>hexfloat</code>マニピュレータや<code>printf()</code>の16進数出力に合わせて、浮動小数点数のリテラルも16進数表記できるようにする</td> <td>3.0</td> <td>3.0</td> <td>18.0</td> <td>2017 Update 5</td> </tr> <tr> <td>P0028R4: <a href="lang/cpp17/using_attribute_namespaces.html">属性の名前空間指定に繰り返しをなくす</a></td> <td><code>[[using CC: opt(1), debug]]</code>のように属性の名前空間宣言をまとめて行う</td> <td>7</td> <td>3.9</td> <td>18.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0035R4: <a href="lang/cpp17/dynamic_memory_allocation_for_over-aligned_data.html">アライメント指定されたデータの動的メモリ確保</a></td> <td><code>operator new</code>と<code>operator delete</code>でアライメント値を取得できるようにする</td> <td>7</td> <td>4</td> <td>19.0</td> <td>2017 Update 5</td> </tr> <tr> <td>P0091R3: <a href="lang/cpp17/type_deduction_for_class_templates.html">クラステンプレートのテンプレート引数推論</a></td> <td>コンストラクタの引数からクラスのテンプレート引数を推論できるようにする</td> <td>7</td> <td>5</td> <td>19.1</td> <td>2017 Update 7</td> </tr> <tr> <td>P0127R2: <a href="lang/cpp17/declaring_non-type_template_arguments_with_auto.html">非型テンプレート引数の<code>auto</code>宣言</a></td> <td><code>template &lt;typename T, T x&gt;</code>という冗長なコードを<code>template &lt;auto x&gt;</code>のようにして受けられるようにし、<br /> <code>X&lt;3&gt;; X&lt;true&gt;; X&lt;'a'&gt;</code>のように定数を簡潔に渡せるようにする</td> <td>7</td> <td>4</td> <td>19.1</td> <td>2017 Update 7</td> </tr> <tr> <td>P0135R1: <a href="lang/cpp17/guaranteed_copy_elision.html">値のコピー省略を保証</a></td> <td>一時オブジェクトをコピーする際に、単純な値を持つクラスであればコピーが省略されることを保証する</td> <td>7</td> <td>4</td> <td>19.1</td> <td>2017 Update 6</td> </tr> <tr> <td>P0145R3: <a href="lang/cpp17/expression_evaluation_order.html">厳密な式の評価順</a></td> <td>式の項が評価される順序を厳密に規定する。<br /> <code>b = a;</code>の式が右から順番(a, bの順)に評価される</td> <td>7</td> <td>4</td> <td>19.1</td> <td>2017 Update 7</td> </tr> <tr> <td>P0283R2: <a href="lang/cpp17/non_standard_attributes.html">不明な属性を無視する</a></td> <td>実装が知らない名前空間の属性は無視する</td> <td>4.8</td> <td>3.0</td> <td>18.0</td> <td>2015</td> </tr> <tr> <td>P0292R2: <a href="lang/cpp17/if_constexpr.html">constexpr if文</a></td> <td><code>if constexpr(cond)</code>とすることで、そのif文はコンパイル時に処理される</td> <td>7</td> <td>3.9</td> <td>19.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0386R2: <a href="lang/cpp17/inline_variables.html">インライン変数</a></td> <td>インライン指定を関数だけでなく変数にも指定できるようにする</td> <td>7</td> <td>3.9</td> <td>19.0</td> <td>2017 Update 5</td> </tr> <tr> <td>P0217R3: <a href="lang/cpp17/structured_bindings.html">構造化束縛</a></td> <td>タプルやユーザー定義型を分解して受け取れるようにする<br /> <code>tuple&lt;int, string&gt; f();</code> <br /> <code>const auto [a, b] = f(); // aはintの値、bはstringの値</code></td> <td>7</td> <td>4</td> <td>18.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0305R1: <a href="lang/cpp17/selection_statements_with_initializer.html">if文とswitch文の条件式と初期化を分離</a></td> <td><code>if (init; condition)</code>のように初期化と条件式を分けて記述できるようにする</td> <td>7</td> <td>3.9</td> <td>18.0</td> <td>2017 Update 3</td> </tr> <tr> <td>P0137R1: <a href="lang/cpp17/replacement_of_class_objects_containing_reference_members.html">参照メンバをもつクラスの置き換え</a></td> <td>参照型メンバや<code>const</code>メンバ変数を含むクラスについてこれまで未定義動作とされていた配置<code>new</code>によるオブジェクトの置き換えを条件付きで可能とする</td> <td>7</td> <td>6.0</td> <td>No</td> <td>2017 Update 7</td> </tr> <tr> <td>P0003R5: <a href="lang/cpp17/remove_deprecated_exception_specifications.html">非推奨だった例外仕様を削除</a></td> <td><code>noexcept</code>が入ったことによって非推奨になった<code>throw</code>キーワードによる例外仕様を削除</td> <td>7</td> <td>4</td> <td>19.0</td> <td>2017 Update 5</td> </tr> <tr> <td>P0195R2: <a href="lang/cpp17/pack_expansions_in_using.html">using宣言でのパック展開</a></td> <td>パラメータパックの型を基底クラスとして指定した場合に、<code>using</code>宣言に基底クラスのパラメータパックを指定できるようにする</td> <td>7</td> <td>4</td> <td>19.0</td> <td>2017 Update 7</td> </tr> <tr> <td>P0512R0: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0512r0.pdf" target="_blank">クラステンプレート引数の推論仕様を調整</a></td> <td></td> <td>8</td> <td>5.0</td> <td>No</td> <td>2017 Update 7</td> </tr> <tr> <td>P0490R0: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0490r0.html" target="_blank">Committee Draftに対するNational Body Commentへの対応</a></td> <td></td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> </tr> <tr> <td>P0522R0: <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0522r0.html" target="_blank">テンプレートテンプレート引数のマッチングにおいて、互換性のあるテンプレートを除外</a></td> <td></td> <td>7</td> <td>4 (partial)</td> <td>19.1</td> <td>2017 Update 5</td> </tr> </tbody> </table> <p>各処理系のC++17実装状況ページ:</p> <ul> <li>GCC: <a href="https://gcc.gnu.org/projects/cxx-status.html#cxx17" target="_blank">C++17 Support in GCC</a></li> <li>Clang: <a href="http://clang.llvm.org/cxx_status.html" target="_blank">C++ Support in Clang</a></li> <li>libc++ : <a href="https://libcxx.llvm.org/Status/Cxx17.html" target="_blank">libc++ C++17 Status</a></li> <li>Visual C++ (MSVC):<ul> <li><a href="https://docs.microsoft.com/ja-jp/cpp/visual-cpp-language-conformance" target="_blank">Visual C++ 言語への準拠</a></li> <li><a href="https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/" target="_blank">Announcing: MSVC Conforms to the C++ Standard</a></li> </ul> </li> <li>ICC: <a href="https://software.intel.com/en-us/articles/c17-features-supported-by-intel-c-compiler" target="_blank">C++17 Features Supported by Intel C++ Compiler</a></li> </ul> <h2><a href="#cpp20" id="cpp20">C++20言語機能の実装状況</a></h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> <th><a href="implementation.html#gcc">GCC</a></th> <th><a href="implementation.html#clang">Clang</a></th> <th><a href="implementation.html#icc">ICC</a></th> <th><a href="implementation.html#visual_cpp">MSVC</a></th> </tr> </thead> <tbody> <tr> <td>P0683R1: <a href="lang/cpp20/default_member_initializers_for_bit_fields.html">ビットフィールドのメンバ変数初期化</a></td> <td>ビットフィールドメンバ変数のデフォルト値を設定する構文を追加する</td> <td>8</td> <td>6.0</td> <td>2021.4</td> <td>2019 Update 5</td> </tr> <tr> <td>P0409R2: <a href="lang/cpp20/allow_lambda_capture_equal_this.html">ラムダ式のキャプチャとして<code>[=, this]</code>を許可する</a></td> <td>デフォルトコピーキャプチャと<code>this</code>ポインタのコピーキャプチャを両方指定できるようにする</td> <td>8</td> <td>6.0</td> <td>2021.4</td> <td>2019 Update 2</td> </tr> <tr> <td>P0806R2: <a href="lang/cpp20/deprecate_implicit_capture_of_this_via_defcopy.html"><code>[=]</code>による<code>this</code>の暗黙のキャプチャを非推奨化</a></td> <td>コピーのデフォルトキャプチャでは、<code>this</code>ポインタをキャプチャされなくする</td> <td>9</td> <td></td> <td></td> <td>2019 Update 2</td> </tr> <tr> <td>P0428R2: <a href="lang/cpp20/familiar_template_syntax_for_generic_lambdas.html">ジェネリックラムダのテンプレート構文</a></td> <td>ジェネリックラムダでテンプレートパラメータを定義できるようにする</td> <td>8</td> <td>9.0</td> <td>2021.4</td> <td>2019 Update 2</td> </tr> <tr> <td>P0704R1: <a href="lang/cpp20/fixing_const_qualified_pointers_to_members.html"><code>const</code>修飾されたメンバポインタの制限を修正</a></td> <td><code>.*</code>演算子での左辺値の<code>const</code>メンバ関数呼び出しを許可する</td> <td>8</td> <td>6.0</td> <td>2021.4</td> <td>2015</td> </tr> <tr> <td>P0306R4: <a href="lang/cpp20/va_opt.html">可変引数が空でない場合のトークン置換</a></td> <td>プリプロセッサの置換で可変引数が空の場合に余計なカンマが付いてしまう問題に対処</td> <td>8 (partial, <code>#__VA_OPT__</code>による文字列化が未サポート)</td> <td>6.0<br /> 9.0 (<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1042r1.html" target="_blank">p1042</a>)</td> <td>2021.4</td> <td>2019 Update 5</td> </tr> <tr> <td>P0329R4: <a href="lang/cpp20/designated_initialization.html">指示付き初期化</a></td> <td>波カッコによる集成体初期化でメンバ名を指定して初期化できるようにする</td> <td>8</td> <td>6.0 (partial)<br />10</td> <td>2021.4</td> <td>2019 Update 1</td> </tr> <tr> <td>P0734R0: <a href="lang/cpp20/concepts.html">コンセプト</a></td> <td>テンプレートパラメータに対する制約を行う</td> <td>10</td> <td>10</td> <td>2021.6</td> <td>2019 Update 3</td> </tr> <tr> <td>P0614R1: <a href="lang/cpp20/range-based_for_statements_with_initializer.html">初期化式をともなう範囲for文</a></td> <td>範囲for文スコープで使用する変数の初期化のための構文を追加</td> <td>9</td> <td>8.0</td> <td>2021.7</td> <td>2019 Update 5</td> </tr> <tr> <td>P0588R1: <a href="lang/cpp20/simplifying_implicit_lambda_capture.html">暗黙のラムダキャプチャを簡略化</a></td> <td>ラムダ式のキャプチャに関する仕様整理</td> <td>8</td> <td>No</td> <td>2021.4</td> <td>2019 Update 4</td> </tr> <tr> <td>P0846R0: <a href="lang/cpp20/adl_and_function_templates_that_are_not_visible.html">関数テンプレートに明示的に型指定した場合にADLで見つからない問題を修正</a></td> <td>名前空間内の関数テンプレートをテンプレート引数指定かつ非修飾・ADLで正しく呼び出せるよう修正</td> <td>9</td> <td>9.0</td> <td>2021.4</td> <td>2019 Update 1</td> </tr> <tr> <td>P0641R2: <a href="lang/cpp20/resolving_const_mismatch_with_defaulted_copy_constructor.html">デフォルトのコピーコンストラクタと非<code>const</code>なコンストラクタが衝突する問題を修正</a></td> <td>非<code>const</code>なオブジェクトをとるコンストラクタを定義すると、そのクラスをラップしたクラスのコピーコンストラクタが<a class="cpprefjp-defined-word">不適格</a>になってしまう問題を修正</td> <td>9</td> <td>8.0</td> <td>2021.4</td> <td>2015</td> </tr> <tr> <td>P0859R0: <a href="lang/cpp20/less_eager_instantiation_of_constexpr_functions.html">評価されない文脈での定数式評価によって特殊メンバ関数がインスタンス化されることを規定</a></td> <td><code>sizeof</code>や<code>decltype</code>などの評価されない文脈において定数式評価を行った場合に、ムーブコンストラクタのような特殊メンバ関数が定義されることを規定</td> <td>9</td> <td>8</td> <td></td> <td>Partial in 2019 Update 7</td> </tr> <tr> <td>P0515R3: <a href="lang/cpp20/consistent_comparison.html"><code>&lt;=&gt;</code>/<code>==</code>による比較演算子の自動定義</a></td> <td>三方比較演算子によって比較演算子の自動生成を行うようにする</td> <td>10</td> <td>8.0 (partial)<br />10</td> <td>2021.4</td> <td>2019</td> </tr> <tr> <td>P0692R1: <a href="lang/cpp20/access_checking_on_specializations.html">特殊化のアクセスチェック</a></td> <td></td> <td>Yes</td> <td>14</td> <td>2021.4</td> <td>2019 Update 6</td> </tr> <tr> <td>P0624R2: <a href="lang/cpp20/default_constructible_and_assignable_stateless_lambdas.html">状態を持たないラムダ式を、デフォルト構築可能、代入可能とする</a></td> <td>キャプチャしていないラムダ式をデフォルト構築・代入可能にする</td> <td>9</td> <td>8.0</td> <td>2021.4</td> <td>2019 Update 2</td> </tr> <tr> <td>P0767R1: <a href="lang/cpp20/deprecate_pod.html">PODを非推奨化</a></td> <td>PODという用語を非推奨化する</td> <td></td> <td></td> <td>2021.4</td> <td>2019 Update 5</td> </tr> <tr> <td>P0315R4: <a href="lang/cpp20/wording_for_lambdas_in_unevaluated_contexts.html">評価されない文脈でのラムダ式</a></td> <td>評価されない文脈でもラムダ式を書くことができるようにする</td> <td>9</td> <td>17</td> <td>2024.0</td> <td>2019 Update 8</td> </tr> <tr> <td>P0840R2: <a href="lang/cpp20/language_support_for_empty_objects.html">空オブジェクトを言語サポート</a></td> <td><code>[[no_unique_address]]</code>属性を導入し、空の型のオブジェクトをほかのオブジェクトと共有する最適化を許可する</td> <td>9</td> <td>9.0</td> <td>2021.4</td> <td>2019 Update 9 <sup><a href="#note-t1-1" id="note_ref-t1-1">†1</a></sup></td> </tr> <tr> <td>P0962R1: <a href="lang/cpp20/relaxing_the_range_for_loop_customization_point_finding_rules.html">範囲for文がカスタマイゼーションポイントを見つけるルールを緩和</a></td> <td><code>begin()</code>/<code>end()</code>メンバ関数のどちらかが見つからなかった場合に非メンバ関数の<code>begin()</code>/<code>end()</code>を探しにいく</td> <td>8</td> <td>8</td> <td>2021.4</td> <td>2019 Update 5</td> </tr> <tr> <td>P0969R0: <a href="lang/cpp20/allow_structured_bindings_to_accessible_members.html">friend指定された関数内から構造化束縛を使用して非公開メンバ変数にアクセスすることを許可</a></td> <td>構造化束縛の仕様として公開メンバ変数のみを取り出せるようになっていたが、friend指定された関数からは非公開メンバ変数にもアクセスできるようにする</td> <td>8</td> <td>8.0</td> <td>2021.4</td> <td>2019</td> </tr> <tr> <td>P0961R1: <a href="lang/cpp20/relaxing_the_structured_bindings_customization_point_finding_rules.html">構造化束縛がカスタマイゼーションポイントを見つけるルールを緩和</a></td> <td>非テンプレートの<code>get()</code>メンバ関数が見つかった場合は、非メンバ関数の<code>get()</code>を探しにいく</td> <td>8</td> <td>8.0</td> <td>2021.4</td> <td>2019</td> </tr> <tr> <td>P0634R3: <a href="lang/cpp20/down_with_typename.html">型の文脈で<code>typename</code>の省略を許可</a></td> <td>型しか現れない文脈では、依存名を解決するための<code>typename</code>キーワードを省略できるようにする</td> <td>9</td> <td>16</td> <td>2023.1</td> <td>2019 Update 9</td> </tr> <tr> <td>P0780R2: <a href="lang/cpp20/allow_pack_expansion_in_lambda_init_capture.html">ラムダ式の初期化キャプチャでのパック展開を許可</a></td> <td><code>[...args = std::move(args)]</code>のようなキャプチャを許可</td> <td>9<br />10</td> <td>9.0</td> <td>2021.7</td> <td>2019 Update 2</td> </tr> <tr> <td>P0479R5: <a href="lang/cpp20/likely_and_unlikely_attributes.html">確率が高い分岐と低い分岐を伝える属性 <code>[[likely]]</code>, <code>[[unlikely]]</code></a></td> <td>条件分岐の最適化ヒントを与える属性</td> <td>9 (partial, <code>switch</code> 文のみ可能)<br /> 10</td> <td>12.0</td> <td>2021.7</td> <td>2019 Update 6</td> </tr> <tr> <td>P0929R2: <a href="lang/cpp20/checking_for_abstract_class_types.html">抽象型のチェック</a></td> <td>関数の宣言段階では、パラメータおよび戻り値型が抽象型かどうかをチェックしないようにする</td> <td>11</td> <td></td> <td></td> <td>2019 Update 5</td> </tr> <tr> <td>P0732R2: <a href="lang/cpp20/class_types_in_non-type_template_parameters.html">非型テンプレートパラメータとしてクラス型を許可する</a></td> <td>定数式として使用できる型を広く非型テンプレートパラメータとして使用できるようにする</td> <td>9</td> <td>12</td> <td>2022.2 Partial</td> <td>2019 Update 6</td> </tr> <tr> <td>P0722R3: <a href="lang/cpp20/efficient_sized_delete_for_variable_sized_classes.html">可変長データを扱うクラスの効率的な<code>delete</code></a></td> <td>クラスの<code>delete</code>演算子が呼び出される前にデストラクタが呼ばれないようにするオプションを追加</td> <td>9</td> <td>6.0</td> <td>2023.0</td> <td>2019 Update 7</td> </tr> <tr> <td>P1064R0: <a href="lang/cpp20/allow_virtual_function_calls_in_constant_expressions.html">定数式からの仮想関数の呼び出しを許可</a></td> <td>仮想関数に<code>constexpr</code>を付けられない制限を解除</td> <td>9</td> <td>9.0</td> <td>2021.4</td> <td>2019 Update 9</td> </tr> <tr> <td>P1327R1: <a href="lang/cpp20/allowing_dynamic_cast_polymorphic_typeid_in_constant_expressions.html">定数式での<code>dynamic_cast</code>、多態的な<code>typeid</code>を許可</a></td> <td>定数式での動的多態を許可</td> <td>10</td> <td>9.0</td> <td>2021.4</td> <td>2019 Update 9</td> </tr> <tr> <td>P1002R1: <a href="lang/cpp20/try-catch_blocks_in_constexpr_functions.html">constexpr関数内でのtry-catchブロックを許可</a></td> <td>constexpr関数内でtry-catchブロックを書けるようにする</td> <td>9</td> <td>8.0</td> <td>2023.1</td> <td>2019 Update 5</td> </tr> <tr> <td>P1073R3: <a href="lang/cpp20/immediate_functions.html">常に定数式評価する<code>consteval</code></a></td> <td><code>consteval</code>キーワードを追加し、常に定数式評価されるよう指定できるようにする</td> <td>11</td> <td>15</td> <td>2021.4</td> <td>2019 Update 10</td> </tr> <tr> <td>P1330R0: <a href="lang/cpp20/changing_the_active_member_of_a_union_inside_constexpr.html">定数式内での共用体のアクティブメンバの変更を許可</a></td> <td>共用体メンバの書き換えを定数式内で行えるようにする</td> <td>9</td> <td>9.0</td> <td>2021.4</td> <td>2017</td> </tr> <tr> <td>P1008R1: <a href="lang/cpp20/prohibit_aggregates_with_user-declared_constructors.html">ユーザー宣言したコンストラクタを持つクラスの集成体初期化を禁止</a></td> <td>コンストラクタが<code>delete</code>/<code>default</code>宣言されているクラスを、集成体初期化によってコンストラクタ呼び出しを回避して構築できてしまっていた技法を禁止</td> <td>9</td> <td>8.0</td> <td>2021.4</td> <td>2019</td> </tr> <tr> <td>P0892R2: <a href="lang/cpp20/explicit_bool.html">関数を条件付きで<code>explicit</code>にする構文を追加</a></td> <td><code>explicit(true)</code>のように<code>explicit</code>に真理値パラメータを指定できるようにする</td> <td>9</td> <td>9.0</td> <td>2021.4</td> <td>2019 Update 2</td> </tr> <tr> <td>P1236R1: <a href="lang/cpp20/signed_integers_are_twos_complement.html">符号付き整数型が2の補数表現であることを規定</a></td> <td>符号付き整数型のビット表現を2の補数に規定する</td> <td>9</td> <td>9.0</td> <td>2023.0</td> <td></td> </tr> <tr> <td>P0482R6: <a href="lang/cpp20/char8_t.html">UTF-8エンコーディングされた文字の型として<code>char8_t</code>を追加</a></td> <td>UTF-8エンコードされた文字かどうかでオーバーロード・特殊化をできるようにする</td> <td>9</td> <td>7 (<code>-fchar8_t</code>オプションが必要)</td> <td>2021.4</td> <td>2019 Update 2</td> </tr> <tr> <td>P1094R2: <a href="lang/cpp20/nested_inline_mamespaces.html">入れ子名前空間定義でのインライン名前空間</a></td> <td><code>namespace ns1::inline ns2::ns3 {}</code>のように、入れ子名前空間を定義する式にインライン名前空間の指定を含められるようにする</td> <td>9</td> <td>8.0</td> <td>2021.4</td> <td>2019 Update 7</td> </tr> <tr> <td>P1091R3: <a href="lang/cpp20/extending_structured_bindings_to_be_more_like_variable_declarations.html">構造化束縛を拡張して通常の変数宣言のように使用できるようにする</a></td> <td>記憶域指定子として<code>static</code>と<code>thread_local</code>の指定を許可</td> <td>10</td> <td>8.0 (partial)</td> <td>2021.4</td> <td>2019 Update 4</td> </tr> <tr> <td>P1381R1: <a href="lang/cpp20/reference_capture_of_structured_bindings.html">構造化束縛した変数の参照キャプチャを許可</a></td> <td>構造化束縛をした変数は特殊な扱いのためラムダ式で参照キャプチャできない規定となっていたがこれを許可する</td> <td>8</td> <td>8.0 (partial)</td> <td>2021.4</td> <td>2017 Update 3</td> </tr> <tr> <td>P0960R3: <a href="lang/cpp20/allow_initializing_aggregates_from_a_parenthesized_list_of_values.html">丸カッコの値リストからの集成体初期化を許可</a></td> <td><code>T x{1, 2, 3};</code>と同様に<code>T x(1, 2, 3);</code>でも集成体初期化できるようにする</td> <td>10</td> <td>No</td> <td>2021.4</td> <td>2019 Update 8</td> </tr> <tr> <td>P1009R2: <a href="lang/cpp20/array_size_deduction_in_new-expressions.html"><code>new</code>式での配列要素数の推論</a></td> <td><code>double* p = new double[]{1,2,3};</code>を許可</td> <td>11</td> <td>9</td> <td>2021.4</td> <td>2019 Update 7</td> </tr> <tr> <td>P1041R4: <a href="lang/cpp20/make_char16t_char32t_string_literals_be_utf16_32.html"><code>char16_t</code>と<code>char32_t</code>の文字・文字列リテラルを、文字コードUTF-16/32に規定</a></td> <td><code>__STDC_UTF_16__</code>、<code>__STDC_UTF_32__</code>の定義に関係なく、<code>char16_t</code>、<code>char32_t</code>のリテラルをUTF-16/32文字コードに規定する</td> <td>10</td> <td>Yes</td> <td>2023.0</td> <td>2015</td> </tr> <tr> <td>P1103R3: <a href="lang/cpp20/modules.html">モジュール</a></td> <td>ヘッダファイル・ソースファイル、インクルードに変わる仕組みとしてモジュールを導入する</td> <td>11 (<code>-fmodules-ts</code>が必要)</td> <td>15<br />8.0 partial (<code>-fmodules</code>, <code>-fmodules-ts</code>が必要)</td> <td>2023.1 (Partial)</td> <td>2019 Update 8</td> </tr> <tr> <td>P0912R5: <a href="lang/cpp20/coroutines.html">コルーチン</a></td> <td>関数実行を中断・再開する仕組みとしてコルーチンを導入する</td> <td>10 (<code>-fcoroutines</code>が必要)</td> <td>8.0 (partial)</td> <td>2021.4</td> <td>2019 Update 8</td> </tr> <tr> <td>P1161R3: <a href="lang/cpp20/deprecate_uses_of_the_comma_operator_in_subscripting_expressions.html">添字演算子内でのカンマ演算子の使用を非推奨化</a></td> <td><code>ar[i, j]</code>を非推奨化。<code>ar[(i, j)]</code>はOK</td> <td>10</td> <td>9.0</td> <td>2021.6</td> <td>2019 Update 5</td> </tr> <tr> <td>P1331R2: <a href="lang/cpp20/permitting_trivial_default_initialization_in_constexpr_contexts.html">constexpr関数内でのトリビアルなデフォルト初期化を許可</a></td> <td>constexpr関数内でのデフォルト初期化を許可し、未初期化値を読むことのみ禁止する</td> <td>10</td> <td>10.0</td> <td>2022.3</td> <td>2019 Update 7</td> </tr> <tr> <td>P0848R3: <a href="lang/cpp20/conditionally_trivial_special_member_functions.html">条件付きで特殊メンバ関数をトリビアルに定義するように</a></td> <td>制約によってトリビアルな特殊メンバ関数と非トリビアルな特殊メンバ関数をオーバーロードできるようにする</td> <td>10</td> <td>16 Partial (consepts 未実装部あり)</td> <td>2022.3</td> <td>2019 Update 8</td> </tr> <tr> <td>P1301R4: <a href="lang/cpp20/nodiscard_should_have_a_reason.html"><code>[[nodiscard]]</code>属性に理由となる文字列を付加できるようにする</a></td> <td>関数の戻り値を無視してはならない理由を関数宣言に持たせ、警告メッセージに役立てる</td> <td>10</td> <td>9.0</td> <td>2021.6</td> <td>2019 Update 5</td> </tr> <tr> <td>P1099R5: <a href="lang/cpp20/using_enum.html">スコープ付き列挙型のusing宣言</a></td> <td><code>using enum EnumType;</code>もしくは<code>using EnumType::enumerator</code>とすることで、列挙値のスコープ指定を省略できるようにする</td> <td>11</td> <td>13</td> <td>2023.0</td> <td>2019 Update 4</td> </tr> <tr> <td>P1816R0: <a href="lang/cpp20/class_template_argument_deduction_for_aggregates.html">集成体クラステンプレートのテンプレート引数推論</a></td> <td>クラステンプレートのテンプレート引数推論はコンストラクタ引数から推論されるが、集成体初期化からも推論できるようにする</td> <td>10</td> <td>No</td> <td>2024.0</td> <td>2019 Update 7</td> </tr> <tr> <td>P1668R1: <a href="lang/cpp20/enabling_constexpr_intrinsics_by_permitting_unevaluated_inline-assembly_in_constexpr_functions.html">constexpr関数内で未評価のインラインアセンブリを許可することによる組み込み関数のconstexpr有効化</a></td> <td>コンパイル時に評価されない場合にconstexpr関数にasm定義を含めることを許可</td> <td>10</td> <td>10.0</td> <td>2022.3</td> <td>2019 Update 9</td> </tr> <tr> <td>P0388R4: <a href="lang/cpp20/permit_conversions_to_arrays_of_unknown_bound.html">要素数不明の配列への変換を許可</a></td> <td>要素数が判明している配列から、要素数が不明の配列への変換を許可</td> <td>10</td> <td>14</td> <td>2021.6</td> <td>2019 Update 7</td> </tr> <tr> <td>P1143R2: <a href="lang/cpp20/constinit.html">コンパイル時初期化を強制する<code>constinit</code>キーワードを追加</a></td> <td>初期化のみコンパイル時におわらせたい場合に使用する</td> <td>10</td> <td>10.0</td> <td>2022.3</td> <td>2019 Update 10</td> </tr> <tr> <td>P1152R4: <a href="lang/cpp20/deprecating_volatile.html">ほとんどの<code>volatile</code>を非推奨化</a></td> <td><code>volatile</code>の有用な機能のみを残し、効果が疑わしい、または壊れている機能を非推奨化する</td> <td>10</td> <td>10.0</td> <td>2021.6</td> <td>2019 Update 7</td> </tr> <tr> <td>P1814R0: <a href="lang/cpp20/class_template_argument_deduction_for_alias_templates.html">エイリアステンプレート経由でのクラステンプレートのテンプレート引数推論</a></td> <td>エイリアステンプレートからクラステンプレートのテンプレート引数を推論できるようにする</td> <td>10</td> <td>No</td> <td></td> <td>2019 Update 7</td> </tr> <tr> <td>P0784R7: <a href="lang/cpp20/more_constexpr_containers.html">可変サイズをもつコンテナの<code>constexpr</code>化</a></td> <td><code>constexpr</code>記憶域をもつメモリアロケータの存在を考慮することで、可変サイズをもつコンテナをコンパイル時に使用できるようにする</td> <td>10</td> <td>10.0</td> <td>2021.6</td> <td>2019 Update 9</td> </tr> <tr> <td>P1957R2: <a href="lang/cpp20/converting_from_pointer_to_bool_should_be_considered_narrowing.html">ポインタから<code>bool</code>への変換を縮小変換とする</a></td> <td>ポインタから<code>bool</code>値への変換を縮小変換と規定することで、意図しない変換を防止する</td> <td>10</td> <td>11.0</td> <td></td> <td>2019 Update 7</td> </tr> </tbody> </table> <ul> <li><a href="#note_ref-t1-1" id="note-t1-1"><strong>^</strong></a> 不明な属性として無視されなくなっただけで期待する効果は得られない。完全に実装されるまでは、代わりに<code><a href="https://devblogs.microsoft.com/cppblog/msvc-cpp20-and-the-std-cpp20-switch/#msvc-extensions-and-abi" target="_blank">[[msvc::no_unique_address]]</a></code>を使用できる。</li> </ul> <p>各処理系のC++20実装状況ページ:</p> <ul> <li>GCC: <a href="https://gcc.gnu.org/projects/cxx-status.html#cxx20" target="_blank">C++20 Support in GCC</a></li> <li>Clang: <a href="http://clang.llvm.org/cxx_status.html" target="_blank">C++ Support in Clang</a></li> <li>libstdc++: <a href="https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2020" target="_blank">C++ 2020 Implementation Status</a></li> <li>libc++: <a href="https://libcxx.llvm.org/Status/Cxx20.html" target="_blank">libc++ C++20 Status</a></li> <li>Visual C++ (MSVC):<ul> <li><a href="https://docs.microsoft.com/ja-jp/cpp/visual-cpp-language-conformance" target="_blank">Visual C++ 言語への準拠</a></li> <li><a href="https://github.com/microsoft/STL/wiki/Changelog" target="_blank">次リリース情報(VS2019,2022) - Change log</a></li> </ul> </li> <li>ICC: <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/c20-features-supported-by-intel-cpp-compiler.html" target="_blank">C++20 Features Supported by Intel® C++ Compiler</a></li> </ul> <h2><a href="#cpp23" id="cpp23">C++23言語機能の実装状況</a></h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> <th><a href="implementation.html#gcc">GCC</a></th> <th><a href="implementation.html#clang">Clang</a></th> <th><a href="implementation.html#icc">ICX</a></th> <th><a href="implementation.html#visual_cpp">MSVC</a></th> </tr> </thead> <tbody> <tr> <td>P0330R8: <a href="lang/cpp23/literal_suffix_for_signed_size_t.html">(符号付き)<code>size_t</code>リテラルのためのサフィックス</a></td> <td><code>42z</code>/<code>42Z</code>とすることで<code>size_t</code>に対応する符号付き整数型のリテラルとする</td> <td>11</td> <td>13</td> <td>2022.2</td> <td>2022 Update 13</td> </tr> <tr> <td>P2290R3: <a href="lang/cpp23/delimited_escape_sequences.html">エスケープシーケンスの区切り</a></td> <td>エスケープシーケンスの範囲を明確にする構文を追加する</td> <td>13</td> <td>15</td> <td>2023.2</td> <td>-</td> </tr> <tr> <td>P2266R3: <a href="lang/cpp23/simpler_implicit_move.html">暗黙的なムーブを簡略化</a></td> <td>参照を返す関数の<code>return</code>文で暗黙的にムーブされない問題を修正</td> <td>13</td> <td>13</td> <td>2022.2</td> <td>-</td> </tr> <tr> <td>P1787R6: <a href="lang/cpp23/declarations_and_where_to_find_them.md.nolink">スコープと名前ルックアップの仕様整理</a></td> <td>複雑で不完全になっているスコープと名前ルックアップの仕様を整理し、一部の問題を解決する</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> </tr> <tr> <td>P2615R1: <a href="lang/cpp23/meaningful_exports.html">無意味なexport宣言を禁止する</a></td> <td>いくつかの不必要な宣言に対するモジュールexportを禁止する</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> </tr> <tr> <td>P2360R0: <a href="lang/cpp23/extend_init_statement_to_allow_alias_declaration.html">初期化文での型の別名宣言を許可</a></td> <td><code>for (using T = int; T e : v) {}</code>を許可</td> <td>12</td> <td>14</td> <td>2022.2</td> <td>-</td> </tr> <tr> <td>P2718R0: <a href="lang/cpp23/lifetime_extension_in_range_based_for_loop.html">範囲for文が範囲初期化子内で生じた一時オブジェクトを延命することを規定</a></td> <td>範囲初期化子内で生じた一時オブジェクトは範囲for文の終わりまで延命される</td> <td>-</td> <td>20</td> <td>-</td> <td>-</td> </tr> <tr> <td>P2324R2: <a href="lang/cpp23/labels_at_the_end_of_compound_statements.html">複合文の末尾へのラベルを許可</a></td> <td>C互換のため、複合文の末尾でのgoto文のラベルを許可する</td> <td>13</td> <td>16</td> <td>2023.2</td> <td>-</td> </tr> <tr> <td>P0847R7: <a href="lang/cpp23/deducing_this.md.nolink">自身のオブジェクトを明示的にパラメータとして指定する</a></td> <td>メンバ関数が<code>*this</code>の型・オブジェクトをパラメータとしてとり、<code>*this</code>オブジェクトがconst/非const、左辺値/右辺値であるかをメンバ関数内で識別できるようにする</td> <td>-</td> <td>18</td> <td>-</td> <td>2022 Update 2 (partial)</td> </tr> <tr> <td>P1847R4: <a href="lang/cpp23/make_declaration_order_layout_mandated.html">アクセス制御の異なるメンバ変数のレイアウトを宣言順に規定</a></td> <td>アクセス制御の異なるメンバ変数のレイアウトは並び替えを許可されていたが宣言順に規定する</td> <td>Yes</td> <td>Yes</td> <td>-</td> <td>2022</td> </tr> <tr> <td>P2128R6: <a href="lang/cpp23/multidimensional_subscript_operator.html">添字演算子の多次元サポート</a></td> <td><code>operator[](int x, int y, int z)</code>のように添字演算子のオーバーロードで複数のパラメータをとることを許可</td> <td>12</td> <td>15</td> <td>2022.2</td> <td>2022 Update 12</td> </tr> <tr> <td>P1169R4: <a href="lang/cpp23/static_operator.html"><code>this</code>ポインタをもつ必要のない演算子を<code>static</code>として宣言できるようにする</a></td> <td>状態をもたないいくつかの演算子を<code>static</code>として宣言できるようにする</td> <td>13</td> <td>16</td> <td>2023.2</td> <td>2022 Update 14</td> </tr> <tr> <td>P2201R1: <a href="lang/cpp23/mixed_string_literal_concatenation.html">異なる文字エンコーディングをもつ文字列リテラルの連結を不適格とする</a></td> <td><code>auto a = u8"" L"";</code>のような異なる文字エンコーディング同士での文字列リテラルの連結を禁止する</td> <td>Yes</td> <td>Yes</td> <td>2022.2</td> <td>Yes</td> </tr> <tr> <td>P2029R4: <a href="lang/cpp23/numeric_and_universal_character_escapes_in_character_and_string_literals.md.nolink">文字・文字列リテラル中の数値・ユニバーサルキャラクタのエスケープに関する問題解決</a></td> <td></td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> </tr> <tr> <td>P2362R3: <a href="lang/cpp23/remove_non_encodable_wide_character_literals_and_multicharacter_wide_character_literals.html">1ワイド文字に収まらないワイド文字リテラルを禁止する</a></td> <td>エンコード結果として<code>wchar_t</code>の大きさに収まらないワイド文字リテラルを禁止する</td> <td>13</td> <td>14</td> <td>2023.2</td> <td>-</td> </tr> <tr> <td>P2071R2: <a href="lang/cpp23/named_universal_character_escapes.html">名前付きユニバーサルキャラクタ名</a></td> <td>16進数のユニバーサルキャラクタだけでなく、その文字の名前を入力できるようにする</td> <td>13</td> <td>15</td> <td>2023.2</td> <td>-</td> </tr> <tr> <td>P2096R2: <a href="lang/cpp23/generalized_wording_for_partial_specializations.html">変数テンプレートの部分特殊化を許可</a></td> <td>変数テンプレートの部分特殊化を許可するために部分特殊化の仕様を汎用化</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> </tr> <tr> <td>P2582R1: <a href="lang/cpp23/class_template_argument_deduction_from_inherited.html">継承コンストラクタからのクラステンプレート引数の推論</a></td> <td>継承コンストラクタからもクラステンプレート引数を推論できるようにする</td> <td>-</td> <td>-</td> <td>-</td> <td>-</td> </tr> <tr> <td>P1938R3: <code><a href="lang/cpp23/if_consteval.html">if consteval</a></code></td> <td>コンパイル時の文脈かどうかで分岐させる</td> <td>12</td> <td>14</td> <td>-</td> <td>2022 Update 14</td> </tr> <tr> <td>P1401R5: <a href="lang/cpp23/narrowing_contextual_conversions_to_bool.html">定数式の文脈での<code>bool</code>への縮小変換を許可</a></td> <td><code>if constexpr(flags &amp; Flags::Exec)</code>や<code>static_assert(N);</code>を許可</td> <td>9</td> <td>13</td> <td>2022.2</td> <td>2022 Update 14</td> </tr> <tr> <td>P2242R3: <a href="lang/cpp23/non_literal_variables_in_constexpr_functions.html">定数式内での非リテラル変数、静的変数・スレッドローカル変数およびgotoとラベルの存在を許可する</a></td> <td>コンパイル時に評価されない限り、定数式内に静的変数・スレッドローカル変数およびgoto文とラベルを含むことを許可する</td> <td>12</td> <td>15</td> <td>2022.2</td> <td>2022 Update 13</td> </tr> <tr> <td>P2246R1: <a href="lang/cpp23/character_encoding_of_diagnostic_text.html">静的な診断メッセージの文字エンコーディング</a></td> <td><code>static_assert</code>や<code>[[deprecated]]</code>などの診断メッセージの文字集合に関する要件をなくす</td> <td>-</td> <td>yes</td> <td>2022.2</td> <td>2022</td> </tr> <tr> <td>P2448R2: <a href="lang/cpp23/relaxing_some_constexpr_restrictions.html"><code>constexpr</code>関数が定数実行できない場合でも適格とする</a></td> <td></td> <td>13</td> <td>17 (partial)</td> <td>2024.0 (partial)</td> <td>-</td> </tr> <tr> <td>P2647R1: <a href="lang/cpp23/permitting_static_constexpr_variables_in_constexpr_functions.html"><code>constexpr</code>関数内での<code>static constexpr</code>変数を許可</a></td> <td><code>constexpr</code>関数のローカルで定数を定義できるようにする</td> <td>13</td> <td>16</td> <td>2023.2</td> <td>-</td> </tr> <tr> <td>P2564R3: <a href="lang/cpp23/consteval_needs_to_propagate_up.html"><code>constexpr</code>関数内で<code>consteval</code>関数を呼び出せない問題を緩和</a></td> <td><code>consteval</code>呼び出しを含む<code>constexpr</code>関数を条件付きで<code>consteval</code>関数とみなすようにする</td> <td>-</td> <td>17</td> <td>2024.0</td> <td>-</td> </tr> <tr> <td>P1102R2: <a href="lang/cpp23/down_with_lambda_parens.html">ラムダ式で<code>()</code>を省略できる条件を緩和</a></td> <td>修飾や戻り値型をともなってもパラメータリストが空であれば<code>()</code>を省略できる</td> <td>11</td> <td>13</td> <td>2022.2</td> <td>2022 Update 14</td> </tr> <tr> <td>P2173R1: <a href="lang/cpp23/attributes_on_lambda_expressions.html">ラムダ式に対する属性</a></td> <td>ラムダ式のいくつかの箇所に属性を記述できるようにする</td> <td>9</td> <td>13</td> <td>2022.2</td> <td>2022 Update 14</td> </tr> <tr> <td>P1774R8: <a href="lang/cpp23/portable_assumptions.html">コード内容の仮定をコンパイラに伝えるassume属性</a></td> <td>最適化のために、コードの仮定をコンパイラに伝える属性を標準化する</td> <td>13</td> <td>19</td> <td>-</td> <td>-</td> </tr> <tr> <td>P2316R2: <a href="lang/cpp23/consistent_character_literal_encoding.html">文字リテラルエンコーディングを一貫させる</a></td> <td>プリプロセッサの条件式での文字リテラルの扱いをC++式と同様にする</td> <td>yes</td> <td>yes</td> <td>2022.2</td> <td>2022</td> </tr> <tr> <td>P2334R1: <a href="lang/cpp23/add_support_for_preprocessing_directives_elifdef_and_elifndef.html"><code>elif</code>/<code>elifdef</code>/<code>elifndef</code>のサポートを追加</a></td> <td><code>#if</code>/<code>#ifdef</code>/<code>#ifndef</code>に対応する複数条件命令のサポートを追加する</td> <td>12</td> <td>13</td> <td>2022.2</td> <td>2022 Update 10</td> </tr> <tr> <td>P2437R1: <a href="lang/cpp23/warning.html"><code>#warning</code>のサポートを追加</a></td> <td>多くのC++コンパイラが実装していたプリプロセス時の警告<code>#warning message</code>を正式サポート</td> <td>yes</td> <td>yes</td> <td>2023.2</td> <td>yes</td> </tr> <tr> <td>P2295R6: <a href="lang/cpp23/support_for_utf8_as_a_portable_source_file_encoding.html">汎用的なソースコードのエンコーディングとしてUTF-8をサポート</a></td> <td>すべてのコンパイラはUTF-8文字コードのソースコードをサポートしなければならない</td> <td>13</td> <td>15</td> <td>2023.2</td> <td>2019 Update 2</td> </tr> <tr> <td>P2223R2: <a href="lang/cpp23/trimming_whitespaces_before_line_splicing.html">行末スペースを無視するよう規定</a></td> <td>行末が「<code>\ </code>」でおわっていた場合にMSVCは行の継続をしない実装になっていたため動作を共通化するため仕様を規定</td> <td>Yes</td> <td>Yes</td> <td>2022.2</td> <td>-</td> </tr> </tbody> </table> <p>各処理系のC++23実装状況ページ:</p> <ul> <li>GCC: <a href="https://gcc.gnu.org/projects/cxx-status.html#cxx23" target="_blank">C++23 Support in GCC</a></li> <li>Clang: <a href="https://clang.llvm.org/cxx_status.html#cxx23" target="_blank">C++23 implementation status</a></li> <li>Visual C++ (MSVC):<ul> <li><a href="https://learn.microsoft.com/en-us/cpp/overview/cpp-conformance-improvements?view=msvc-170" target="_blank">C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022</a></li> <li><a href="https://devblogs.microsoft.com/cppblog/msvc-compiler-updates-in-visual-studio-2022-version-17-13/" target="_blank">C++ Language Updates in MSVC in Visual Studio 2022 17.13</a></li> <li><a href="https://devblogs.microsoft.com/cppblog/msvc-compiler-language-updates-in-visual-studio-2022-version-17-12/" target="_blank">MSVC Compiler Language Updates in Visual Studio 2022 version 17.12</a></li> <li><a href="https://devblogs.microsoft.com/cppblog/c-language-updates-in-msvc-in-visual-studio-2022-17-14/" target="_blank">C++ Language Updates in MSVC in Visual Studio 2022 17.14</a></li> </ul> </li> <li>ICX: <a href="https://www.intel.com/content/www/us/en/developer/articles/technical/c23-features-supported-by-intel-c-compiler.html" target="_blank">C++23 Features Supported by Intel® C++ Compiler</a></li> </ul> <h2><a href="#cpp26" id="cpp26">C++26言語機能の実装状況</a></h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> <th><a href="implementation.html#gcc">GCC</a></th> <th><a href="implementation.html#clang">Clang</a></th> <th><a href="implementation.html#icc">ICX</a></th> <th><a href="implementation.html#visual_cpp">MSVC</a></th> </tr> </thead> <tbody> <tr> <td>P2752R3: <a href="lang/cpp26/static_storage_for_braced_initializers.html"><code>std::initializer_list</code>の配列を静的記憶域に配置する</a></td> <td><code>std::vector v = {1, 2, 3};</code>のような初期化で初期化子リストを静的記憶域に配置することで無駄なコピーをなくす</td> <td>14</td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2169R4: <a href="lang/cpp26/nice_placeholder_with_no_name.html">宣言のみで使用しない変数の名前として<code>_</code>をサポート</a></td> <td>変数名<code>_</code>は暗黙で<code>[[maybe_unused]]</code>が指定される</td> <td>14</td> <td>18</td> <td></td> <td></td> </tr> <tr> <td>P1854R4: <a href="lang/cpp26/making_non-encodable_string_literals_ill-formed.html">文字列リテラルの文字エンコーディング失敗を不適格とする</a></td> <td>文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする</td> <td>14</td> <td>14</td> <td></td> <td></td> </tr> <tr> <td>P2361R6: <a href="lang/cpp26/unevaluated_strings.md.nolink">コンパイル時にのみ使用される文字列の扱いを明確化</a></td> <td><code>static_assert</code>や<code>[[deprecated]]</code>などで使用されるコンパイル時の文字列について、文字コードの指定を禁止し、実行時エンコーディングが行われないことを規定</td> <td>14</td> <td>18</td> <td></td> <td></td> </tr> <tr> <td>P2552R3: <a href="lang/cpp26/on_the_ignorability_of_standard_attributes.html">属性の無視性を見直し</a></td> <td>構文として適格な属性のみを無視できるようにし、そうでない属性の使用を<a class="cpprefjp-defined-word">不適格</a>とする</td> <td>15</td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2738R1: <a href="lang/cpp26/constexpr_cast_from_voidptr.html">定数式での<code>void*</code>からポインタ型へのキャストを許可</a></td> <td>型消去のために<code>void*</code>からポインタ型へのキャストを許可する</td> <td>14</td> <td>17</td> <td></td> <td></td> </tr> <tr> <td>P2741R3: <a href="lang/cpp26/user-generated_static_assert_messages.html"><code>static_assert</code>の診断メッセージにユーザーが生成した文字列の指定を許可</a></td> <td><code>constexpr</code>な<code>S.size()</code>と<code>S.data()</code>メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする</td> <td>14</td> <td>17</td> <td></td> <td></td> </tr> <tr> <td>P2558R2: <a href="lang/cpp26/add_atsign_dollar_graveaccent_to_the_basic_character_set.html">基本文字集合に@、$、`を追加</a></td> <td>C言語との互換性のためにこれらの文字を基本文字集合に追加</td> <td>15</td> <td>Yes</td> <td></td> <td></td> </tr> <tr> <td>P2662R3: <a href="lang/cpp26/pack_indexing.html">パラメータパックへのインデックスアクセスを許可</a></td> <td>可変引数テンプレートのパラメータパックに添字アクセスできるようにする</td> <td>15</td> <td>19</td> <td></td> <td></td> </tr> <tr> <td>P2864R2: <a href="lang/cpp26/remove_deprecated_arithmetic_conversion_on_enumerations.html">非推奨となっていた列挙値から算術型への暗黙変換を削除</a></td> <td>C++20から非推奨となっていた列挙値への算術演算で算術型に暗黙変換される仕様を削除</td> <td>14</td> <td>18</td> <td></td> <td></td> </tr> <tr> <td>P2748R5: <a href="lang/cpp26/disallow_binding_a_returned_glvalue_to_a_temporary.html">返却された左辺値から暗黙変換された一時オブジェクトが参照に束縛されることを禁止する</a></td> <td>寿命切れの変数によって引き起こされるバグを防止する</td> <td>14</td> <td>19</td> <td></td> <td></td> </tr> <tr> <td>P3106R1: <a href="lang/cpp26/clarifying_rules_for_brace_elision_in_aggregate_initialization.html">要素数不明の配列を集成体初期化する規則を明確化</a></td> <td>配列要素の集成体初期化で<code>{}</code>が省略された場合の矛盾していた規定を修正</td> <td>yes</td> <td>17</td> <td></td> <td></td> </tr> <tr> <td>P0609R3: <a href="lang/cpp26/attributes_for_structured_bindings.html">構造化束縛への属性を許可</a></td> <td><code>auto [a, b [[maybe_unused]], c] = f();</code>のように構造化束縛の要素に対して属性を付加できるようにする</td> <td>15</td> <td>19</td> <td></td> <td></td> </tr> <tr> <td>P3034R1: <a href="lang/cpp26/module_declarations_shouldnt_be_macros.html">モジュール宣言でのモジュール名のマクロ展開を禁止する</a></td> <td><code>export module MACRO_NAME;</code>を禁止</td> <td>15</td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2809R3: <a href="lang/cpp26/trivial_infinite_loops_are_not_undefined_behavior.html">空の無限ループは未定義動作ではないと規定</a></td> <td>並行プログラムの進行保証などを考慮して空の無限ループを未定義動作ではないものとする</td> <td>14</td> <td>19</td> <td></td> <td></td> </tr> <tr> <td>P2795R5: <a href="lang/cpp26/erroneous_behavior_for_uninitialized_reads.html">未初期化変数の読み取りをエラー性動作とする</a></td> <td>初期化されていない自動変数の読み取りの安全性を規定する</td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2573R2: <a href="lang/cpp26/delete_reason.html">関数宣言を削除する理由を指定できるようにする</a></td> <td><code>f() = delete("reason");</code></td> <td>15</td> <td>19</td> <td></td> <td></td> </tr> <tr> <td>P2893R3: <a href="lang/cpp26/variadic_friends.html">可変引数テンプレートで<code>friend</code>宣言をできるようにする</a></td> <td>クラステンプレートの可変引数テンプレートでまとめて<code>friend</code>宣言できるようにする</td> <td>15</td> <td>20</td> <td></td> <td></td> </tr> <tr> <td>P2747R2: <a href="lang/cpp26/constexpr_placement_new.html"><code>constexpr</code>配置<code>new</code></a></td> <td>定数式の文脈での配置<code>new</code>を許可</td> <td>15</td> <td>20</td> <td></td> <td></td> </tr> <tr> <td>P3144R2: <a href="lang/cpp26/deleting_a_pointer_to_an_incomplete_type_should_be_ill-formed.html">不完全型へのポインタに対する<code>delete</code>を不適格とする</a></td> <td>未定義動作を引き起こす操作をコンパイルエラーとする</td> <td>15</td> <td>19</td> <td></td> <td></td> </tr> <tr> <td>P2963R3: <a href="lang/cpp26/ordering_of_constraints_involving_fold_expressions.md.nolink">制約式内での畳み込み式の順序付け</a></td> <td>畳み込み式では全体ではなく個別の制約を原子制約式として扱う</td> <td></td> <td>19</td> <td></td> <td></td> </tr> <tr> <td>P0963R3: <a href="lang/cpp26/structured_binding_declaration_as_a_condition.html">条件式での構造化束縛の使用を許可</a></td> <td>式全体を<code>bool</code>値に変換できる場合に条件式で構造化束縛を使用できることとする</td> <td>15</td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2686R5: <a href="lang/cpp26/constexpr_structured_bindings_and_references_to_constexpr_variables.html"><code>constexpr</code>構造化束縛の許可と、<code>constexpr</code>参照の制限緩和</a></td> <td>定数式に対する構造化束縛を許可し、関連して<code>constexpr</code>参照の制限を緩和して自動変数も参照できるようにする</td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td>P3068R6: <a href="lang/cpp26/allowing_exception_throwing_in_constant-evaluation.html">定数評価での例外送出を許可</a></td> <td>定数式の文脈での例外の送出と捕捉を許可</td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2865R6: <a href="lang/cpp26/remove_deprecated_array_comparisons.html">非推奨だった組み込み配列の比較を削除</a></td> <td>C++20で非推奨となっていた配列比較を削除</td> <td>15</td> <td>20</td> <td></td> <td></td> </tr> <tr> <td>P1061R10: <a href="lang/cpp26/structured_bindings_can_introduce_a_pack.html">構造化束縛でパックを導入できるようにする</a></td> <td>タプルを分解する際に複数の変数をパックとして宣言できるようにする。<code>auto [a, ...xs] = f();</code></td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td>P3176R0: <a href="lang/cpp26/the_oxford_variadic_comma.html">先行するカンマのない省略記号を非推奨化</a></td> <td><code>void f(int, ...);</code>はOK。<code>void f(int...);</code>は非推奨</td> <td>15</td> <td>20</td> <td></td> <td></td> </tr> <tr> <td>P3074R7: <a href="lang/cpp26/trivial_unions.md.nolink">共用体をトリビアルに未初期化できるようにする</a></td> <td><code>constexpr</code>での<code>union U { T storage[N]; };</code>を許可し、未初期化にできるようにする</td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2900R14: <a href="lang/cpp26/contracts.html">契約プログラミングをサポートする</a></td> <td>関数の事前条件、事後条件、不変条件を記述できるようにする</td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2841R7: <a href="lang/cpp26/concept_and_variable-template_template-parameters.md.nolink">コンセプトと変数テンプレートにテンプレートテンプレートパラメータのサポートを追加</a></td> <td>テンプレート引数をあとで指定するテンプレートテンプレートパラメータを、コンセプトと変数テンプレートでも使用できるようにする</td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td>P1967R14: <a href="lang/cpp26/embed.html">ファイルを読み込む<code>#embed</code>命令を追加</a></td> <td>バイナリファイルをインクルードするメカニズム。<code>#include</code>とちがって読み出しサイズなどの柔軟な指定ができる</td> <td>15</td> <td></td> <td></td> <td></td> </tr> <tr> <td>P3618R0: <a href="lang/cpp26/allow_attaching_main_to_the_global_module.md.nolink"><code>main</code>関数をグローバルモジュールに含められるようにする</a></td> <td><code>main</code>関数に<code>extern "C++"</code>を指定できるようにすることで名前付きモジュールに含められるようにする</td> <td>16</td> <td>21</td> <td></td> <td></td> </tr> <tr> <td>P2996R13: <a href="lang/cpp26/reflection.md.nolink">静的リフレクション</a></td> <td>リフレクション演算子<code>^^</code>と<code>std::meta::info</code>型によりコンパイル時にさまざまな情報を取得できる</td> <td></td> <td></td> <td></td> <td></td> </tr> <tr> <td>P1306R5: <a href="lang/cpp26/expansion_statements.md.nolink">コンパイル時のタプルやリストを展開処理する<code>template for</code>文</a></td> <td>クラス・タプル・Range・パラメータパックなどを展開してすべての要素をコンパイル時の処理する<code>template for</code>文を追加</td> <td>16</td> <td></td> <td></td> <td></td> </tr> <tr> <td>P3533R2: <a href="lang/cpp26/constexpr_virtual_inheritance.md.nolink"><code>constexpr</code>仮想継承を許可</a></td> <td>定数式の文脈での仮想継承を許可</td> <td>16</td> <td></td> <td></td> <td></td> </tr> <tr> <td>P2843R3: <a href="lang/cpp26/preprocessing_is_never_undefined.md.nolink">プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更</a></td> <td>プリプロセッサとレキサーの文脈での「未定義動作」用語を<a class="cpprefjp-defined-word">不適格</a> (診断不要) に変更</td> <td>16</td> <td></td> <td></td> <td></td> </tr> <tr> <td>P3868R1: <a href="lang/cpp26/allow_line_before_module_declarations.md.nolink">モジュール宣言より前での<code>#line</code>ディレクティブの使用を許可する</a></td> <td>モジュール宣言より前での<code>#line</code>ディレクティブの使用を禁止していたのは過度な制限だった</td> <td></td> <td></td> <td></td> <td></td> </tr> </tbody> </table> <p>各処理系のC++26実装状況ページ:</p> <ul> <li>GCC: <a href="https://gcc.gnu.org/projects/cxx-status.html#cxx26" target="_blank">C++26 Support in GCC</a></li> <li>Clang:<ul> <li><a href="https://clang.llvm.org/cxx_status.html#cxx26" target="_blank">C++2c implementation status</a></li> <li><a href="https://libcxx.llvm.org/Status/Format.html" target="_blank">libc++ Format Status</a></li> </ul> </li> <li>Visual C++ (MSVC):<ul> <li><a href="https://learn.microsoft.com/en-us/cpp/overview/cpp-conformance-improvements?view=msvc-170" target="_blank">C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022</a></li> </ul> </li> </ul></div> Akiko Kawai [email protected] flat_map -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_map/flat_map.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_map/flat_map.md b/reference/flat_map/flat_map.md index b63924ae8..2db5af5af 100644 --- a/reference/flat_map/flat_map.md +++ b/reference/flat_map/flat_map.md @@ -44,7 +44,7 @@ namespace std { `value_type`は、[`std::map`](/reference/map/map.md)では[`std::pair`](/reference/utility/pair.md)`&lt;const Key, T&gt;`だが、このクラスは[`std::pair`](/reference/utility/pair.md)`&lt;Key, T&gt;`である (`const`がつかない)。 -以下の不変条件をもち、メンバ関数のいずれかが例外によって終了した場合には不変条件の状態に復元される (ただし、その復元操作によってコンテナが空になる可能性がある): +以下の不変条件をもち、メンバ関数のいずれかが例外によって終了した場合には不変条件の状態に復元される (ただし、その復元操作によってコンテナが空になる可能性がある)。ムーブコンストラクタとムーブ代入演算子の場合、両方の引数の不変条件が復元される: - キーの配列と値の配列が、同じ要素数をもつ - キーの配列が、指定された比較関数オブジェクトを尊重してソートを行う @@ -369,3 +369,5 @@ int main() - C++23で`flat_map`が導入された経緯・動機・設計について記載されている - [P0429R9 A Standard `flat_map`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf) - C++23で導入された`flat_map`の仕様 +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で`swap`の条件付き`noexcept`、`insert_range`のソート済みオーバーロード追加などの修正が行われた </code></pre> Akira Takahashi [email protected] insert_range -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_map/flat_map/insert_range.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_map/flat_map/insert_range.md b/reference/flat_map/flat_map/insert_range.md index 4862be338..9c939b647 100644 --- a/reference/flat_map/flat_map/insert_range.md +++ b/reference/flat_map/flat_map/insert_range.md @@ -7,11 +7,15 @@ ```cpp template&lt;container-compatible-range&lt;value_type&gt; R&gt; -void insert_range(R&amp;&amp; rg); // (1) C++23 +void insert_range(R&amp;&amp; rg); // (1) C++23 template&lt;container-compatible-range&lt;value_type&gt; R&gt; -constexpr void insert_range(R&amp;&amp; rg); // (1) C++26 +constexpr void insert_range(R&amp;&amp; rg); // (1) C++26 + +template&lt;container-compatible-range&lt;value_type&gt; R&gt; +constexpr void insert_range(sorted_unique_t, R&amp;&amp; rg); // (2) C++26 ``` * container-compatible-range[link /reference/exposition-only/container-compatible-range.md] +* sorted_unique_t[link /reference/flat_map/sorted_unique_t.md] ## 概要 Rangeを挿入し、コンテナを拡張する。 @@ -26,17 +30,19 @@ Rangeを挿入し、コンテナを拡張する。 ## 効果 -- メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: +- (1) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: ```cpp - for (const auto&amp; e : rg) { - c.keys.insert(c.keys.end(), e.first); - c.values.insert(c.values.end(), e.second); - } + ranges::for_each(rg, [&amp;](value_type e) { + c.keys.insert(c.keys.end(), std::move(e.first)); + c.values.insert(c.values.end(), std::move(e.second)); + }); ``` * c.keys[link containers.md] * c.values[link containers.md] + * ranges::for_each[link /reference/algorithm/ranges_for_each.md] * end()[link /reference/vector/vector/end.md] * insert[link /reference/vector/vector/insert.md] + * std::move[link /reference/utility/move.md] * first[link /reference/utility/pair/first.md] * second[link /reference/utility/pair/second.md] @@ -58,13 +64,16 @@ Rangeを挿入し、コンテナを拡張する。 * key_equiv[link key_equiv.md] * distance[link /reference/iterator/distance.md] +- (2) : `insert_range(rg)`と等価 + ## 戻り値 なし ## 計算量 -- Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM +- (1) : Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM +- (2) : 線形 ## 備考 @@ -123,3 +132,6 @@ int main() ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で(2)の`sorted_unique_t`をとるオーバーロードが追加された + - C++26で(1)の効果が、要素のコピーではなくムーブを行うように修正された </code></pre> Akira Takahashi [email protected] swap -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_map/flat_map/swap.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_map/flat_map/swap.md b/reference/flat_map/flat_map/swap.md index 2936b8f8d..7a2c6a112 100644 --- a/reference/flat_map/flat_map/swap.md +++ b/reference/flat_map/flat_map/swap.md @@ -6,9 +6,13 @@ * cpp23[meta cpp] ```cpp -void swap(flat_map&amp; y) noexcept; // (1) C++23 -constexpr void swap(flat_map&amp; y) noexcept; // (1) C++26 +void swap(flat_map&amp; y) noexcept; // (1) C++23 +constexpr void swap(flat_map&amp; y) + noexcept(is_nothrow_swappable_v&lt;key_container_type&gt; &amp;&amp; + is_nothrow_swappable_v&lt;mapped_container_type&gt; &amp;&amp; + is_nothrow_swappable_v&lt;key_compare&gt;); // (1) C++26 ``` +* is_nothrow_swappable_v[link /reference/type_traits/is_nothrow_swappable.md] ## 概要 コンテナ内のコンテンツを、同じ型の要素を保持する他の `flat_map` オブジェクトである `y` 内のコンテンツと交換する。 @@ -84,3 +88,5 @@ fm2 : {[10,a], [20,b], [30,c]} ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で、`noexcept`指定が無条件から条件付きに変更された。内部コンテナと比較関数オブジェクトの`swap`が例外を送出しない場合にのみ`noexcept`となる </code></pre> Akira Takahashi [email protected] swap (非メンバ関数) -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_map/flat_map/swap_free.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_map/flat_map/swap_free.md b/reference/flat_map/flat_map/swap_free.md index 298884270..fed530423 100644 --- a/reference/flat_map/flat_map/swap_free.md +++ b/reference/flat_map/flat_map/swap_free.md @@ -13,7 +13,8 @@ namespace std { template &lt;class Key, class T, class Compare, class KeyContainer, class MappedContainer&gt; constexpr void swap(flat_map&lt;Key, T, Compare, KeyContainer, MappedContainer&gt;&amp; x, - flat_map&lt;Key, T, Compare, KeyContainer, MappedContainer&gt;&amp; y); // (1) C++26 + flat_map&lt;Key, T, Compare, KeyContainer, MappedContainer&gt;&amp; y) + noexcept(noexcept(x.swap(y))); // (1) C++26 } ``` @@ -90,3 +91,5 @@ fm2 : {[10,a], [20,b], [30,c]} ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で、`noexcept`指定が条件付きに変更された。メンバ関数[`swap()`](swap.md)の`noexcept`条件に従う </code></pre> Akira Takahashi [email protected] flat_multimap -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_map/flat_multimap.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_map/flat_multimap.md b/reference/flat_map/flat_multimap.md index f857ebef2..21c81b18a 100644 --- a/reference/flat_map/flat_multimap.md +++ b/reference/flat_map/flat_multimap.md @@ -44,7 +44,7 @@ namespace std { `value_type`は、[`std::multimap`](/reference/map/multimap.md)では[`std::pair`](/reference/utility/pair.md)`&lt;const Key, T&gt;`だが、このクラスは[`std::pair`](/reference/utility/pair.md)`&lt;Key, T&gt;`である (`const`がつかない)。 -以下の不変条件をもち、メンバ関数のいずれかが例外によって終了した場合には不変条件の状態に復元される (ただし、その復元操作によってコンテナが空になる可能性がある): +以下の不変条件をもち、メンバ関数のいずれかが例外によって終了した場合には不変条件の状態に復元される (ただし、その復元操作によってコンテナが空になる可能性がある)。ムーブコンストラクタとムーブ代入演算子の場合、両方の引数の不変条件が復元される: - キーの配列と値の配列が、同じ要素数をもつ - キーの配列が、指定された比較関数オブジェクトを尊重してソートを行う @@ -284,3 +284,5 @@ int main() - C++23で`flat_map`が導入された経緯・動機・設計について記載されている - [P0429R9 A Standard `flat_map`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p0429r9.pdf) - C++23で導入された`flat_map`の仕様 +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で`swap`の条件付き`noexcept`、`insert_range`のソート済みオーバーロード追加などの修正が行われた </code></pre> Akira Takahashi [email protected] insert_range -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_map/flat_multimap/insert_range.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_map/flat_multimap/insert_range.md b/reference/flat_map/flat_multimap/insert_range.md index 40801e514..3ac0eb744 100644 --- a/reference/flat_map/flat_multimap/insert_range.md +++ b/reference/flat_map/flat_multimap/insert_range.md @@ -7,11 +7,15 @@ ```cpp template&lt;container-compatible-range&lt;value_type&gt; R&gt; -void insert_range(R&amp;&amp; rg); // (1) C++23 +void insert_range(R&amp;&amp; rg); // (1) C++23 template&lt;container-compatible-range&lt;value_type&gt; R&gt; -constexpr void insert_range(R&amp;&amp; rg); // (1) C++26 +constexpr void insert_range(R&amp;&amp; rg); // (1) C++26 + +template&lt;container-compatible-range&lt;value_type&gt; R&gt; +constexpr void insert_range(sorted_equivalent_t, R&amp;&amp; rg); // (2) C++26 ``` * container-compatible-range[link /reference/exposition-only/container-compatible-range.md] +* sorted_equivalent_t[link /reference/flat_map/sorted_equivalent_t.md] ## 概要 Rangeを挿入し、コンテナを拡張する。 @@ -22,30 +26,35 @@ Rangeを挿入し、コンテナを拡張する。 ## 効果 -- メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: +- (1) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: ```cpp - for (const auto&amp; e : rg) { - c.keys.insert(c.keys.end(), e.first); - c.values.insert(c.values.end(), e.second); - } + ranges::for_each(rg, [&amp;](value_type e) { + c.keys.insert(c.keys.end(), std::move(e.first)); + c.values.insert(c.values.end(), std::move(e.second)); + }); ``` * c.keys[link containers.md] * c.values[link containers.md] + * ranges::for_each[link /reference/algorithm/ranges_for_each.md] * end()[link /reference/vector/vector/end.md] * insert[link /reference/vector/vector/insert.md] + * std::move[link /reference/utility/move.md] * first[link /reference/utility/pair/first.md] * second[link /reference/utility/pair/second.md] - 次に、新しく挿入された要素の範囲を`value_comp()`を基準にソートする - 次に、ソートされた結果の範囲と、既存の要素のソートされた範囲をひとつのソートされた範囲にマージする +- (2) : `insert_range(rg)`と等価 + ## 戻り値 なし ## 計算量 -- Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM +- (1) : Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM +- (2) : 線形 ## 備考 @@ -103,3 +112,6 @@ int main() ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で(2)の`sorted_equivalent_t`をとるオーバーロードが追加された + - C++26で(1)の効果が、要素のコピーではなくムーブを行うように修正された </code></pre> Akira Takahashi [email protected] swap -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_map/flat_multimap/swap.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_map/flat_multimap/swap.md b/reference/flat_map/flat_multimap/swap.md index 18f86609a..9002d9952 100644 --- a/reference/flat_map/flat_multimap/swap.md +++ b/reference/flat_map/flat_multimap/swap.md @@ -6,9 +6,13 @@ * cpp23[meta cpp] ```cpp -void swap(flat_multimap&amp; y) noexcept; // (1) C++23 -constexpr void swap(flat_multimap&amp; y) noexcept; // (1) C++26 +void swap(flat_multimap&amp; y) noexcept; // (1) C++23 +constexpr void swap(flat_multimap&amp; y) + noexcept(is_nothrow_swappable_v&lt;key_container_type&gt; &amp;&amp; + is_nothrow_swappable_v&lt;mapped_container_type&gt; &amp;&amp; + is_nothrow_swappable_v&lt;key_compare&gt;); // (1) C++26 ``` +* is_nothrow_swappable_v[link /reference/type_traits/is_nothrow_swappable.md] ## 概要 コンテナ内のコンテンツを、同じ型の要素を保持する他の `flat_multimap` オブジェクトである `y` 内のコンテンツと交換する。 @@ -81,6 +85,7 @@ fm2 : {[10,a], [20,b], [30,c]} - [GCC](/implementation.md#gcc): ?? - [Visual C++](/implementation.md#visual_cpp): ?? - ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で、`noexcept`指定が無条件から条件付きに変更された。内部コンテナと比較関数オブジェクトの`swap`が例外を送出しない場合にのみ`noexcept`となる </code></pre> Akira Takahashi [email protected] swap (非メンバ関数) -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_map/flat_multimap/swap_free.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_map/flat_multimap/swap_free.md b/reference/flat_map/flat_multimap/swap_free.md index 7dbc1bda7..a21a02ec8 100644 --- a/reference/flat_map/flat_multimap/swap_free.md +++ b/reference/flat_map/flat_multimap/swap_free.md @@ -13,7 +13,8 @@ namespace std { template &lt;class Key, class T, class Compare, class KeyContainer, class MappedContainer&gt; constexpr void swap(flat_multimap&lt;Key, T, Compare, KeyContainer, MappedContainer&gt;&amp; x, - flat_multimap&lt;Key, T, Compare, KeyContainer, MappedContainer&gt;&amp; y); // (1) C++26 + flat_multimap&lt;Key, T, Compare, KeyContainer, MappedContainer&gt;&amp; y) + noexcept(noexcept(x.swap(y))); // (1) C++26 } ``` @@ -87,6 +88,7 @@ fm2 : {[10,a], [20,b], [30,c]} - [GCC](/implementation.md#gcc): ?? - [Visual C++](/implementation.md#visual_cpp): ?? - ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で、`noexcept`指定が条件付きに変更された。メンバ関数[`swap()`](swap.md)の`noexcept`条件に従う </code></pre> Akira Takahashi [email protected] flat_multiset -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_set/flat_multiset.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_set/flat_multiset.md b/reference/flat_set/flat_multiset.md index 3c6c273be..632700a36 100644 --- a/reference/flat_set/flat_multiset.md +++ b/reference/flat_set/flat_multiset.md @@ -260,3 +260,5 @@ int main() - C++23で`flat_set`が導入された経緯・動機・設計について記載されている - [P1222R4 A Standard `flat_set`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1222r4.pdf) - C++23で導入された`flat_set`の仕様 +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で`swap`の条件付き`noexcept`、`insert_range`のソート済みオーバーロード追加などの修正が行われた </code></pre> Akira Takahashi [email protected] insert_range -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_set/flat_multiset/insert_range.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_set/flat_multiset/insert_range.md b/reference/flat_set/flat_multiset/insert_range.md index 93d22062d..6e11b15c3 100644 --- a/reference/flat_set/flat_multiset/insert_range.md +++ b/reference/flat_set/flat_multiset/insert_range.md @@ -7,11 +7,15 @@ ```cpp template&lt;container-compatible-range&lt;value_type&gt; R&gt; -void insert_range(R&amp;&amp; rg); // (1) C++23 +void insert_range(R&amp;&amp; rg); // (1) C++23 template&lt;container-compatible-range&lt;value_type&gt; R&gt; -constexpr void insert_range(R&amp;&amp; rg); // (1) C++26 +constexpr void insert_range(R&amp;&amp; rg); // (1) C++26 + +template&lt;container-compatible-range&lt;value_type&gt; R&gt; +constexpr void insert_range(sorted_equivalent_t, R&amp;&amp; rg); // (2) C++26 ``` * container-compatible-range[link /reference/exposition-only/container-compatible-range.md] +* sorted_equivalent_t[link /reference/flat_set/sorted_equivalent_t.md] ## 概要 Rangeを挿入し、コンテナを拡張する。 @@ -21,12 +25,31 @@ Rangeを挿入し、コンテナを拡張する。 内部的に `flat_multiset` コンテナは、コンストラクト時に指定された比較オブジェクトによって要素を下位から上位へとソートして保持する。 +## 効果 +- (1) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: + ```cpp + ranges::for_each(rg, [&amp;](auto&amp;&amp; e) { + c.insert(c.end(), std::forward&lt;decltype(e)&gt;(e)); + }); + ``` + * ranges::for_each[link /reference/algorithm/ranges_for_each.md] + * end()[link /reference/vector/vector/end.md] + * insert[link /reference/vector/vector/insert.md] + * std::forward[link /reference/utility/forward.md] + + - 次に、新しく挿入された要素の範囲を`value_comp()`を基準にソートする + - 次に、ソートされた結果の範囲と、既存の要素のソートされた範囲をひとつのソートされた範囲にマージする + +- (2) : `insert_range(rg)`と等価 + + ## 戻り値 なし ## 計算量 -- Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM +- (1) : Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM +- (2) : 線形 ## 備考 @@ -77,3 +100,5 @@ int main() ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で(2)の`sorted_equivalent_t`をとるオーバーロードが追加された </code></pre> Akira Takahashi [email protected] swap -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_set/flat_multiset/swap.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_set/flat_multiset/swap.md b/reference/flat_set/flat_multiset/swap.md index 711279903..67ab777cd 100644 --- a/reference/flat_set/flat_multiset/swap.md +++ b/reference/flat_set/flat_multiset/swap.md @@ -6,9 +6,12 @@ * cpp23[meta cpp] ```cpp -void swap(flat_multiset&amp; y) noexcept; // (1) C++23 -constexpr void swap(flat_multiset&amp; y) noexcept; // (1) C++26 +void swap(flat_multiset&amp; y) noexcept; // (1) C++23 +constexpr void swap(flat_multiset&amp; y) + noexcept(is_nothrow_swappable_v&lt;container_type&gt; &amp;&amp; + is_nothrow_swappable_v&lt;key_compare&gt;); // (1) C++26 ``` +* is_nothrow_swappable_v[link /reference/type_traits/is_nothrow_swappable.md] ## 概要 コンテナ内のコンテンツを、同じ型の要素を保持する他の `flat_multiset` オブジェクトである `y` 内のコンテンツと交換する。 @@ -78,3 +81,5 @@ fs2 : {10, 20, 30} ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で、`noexcept`指定が無条件から条件付きに変更された。内部コンテナと比較関数オブジェクトの`swap`が例外を送出しない場合にのみ`noexcept`となる </code></pre> Akira Takahashi [email protected] swap (非メンバ関数) -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_set/flat_multiset/swap_free.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_set/flat_multiset/swap_free.md b/reference/flat_set/flat_multiset/swap_free.md index 0192721c2..4e991b768 100644 --- a/reference/flat_set/flat_multiset/swap_free.md +++ b/reference/flat_set/flat_multiset/swap_free.md @@ -13,7 +13,8 @@ namespace std { template &lt;class Key, class Compare, class KeyContainer&gt; constexpr void swap(flat_multiset&lt;Key, Compare, KeyContainer&gt;&amp; x, - flat_multiset&lt;Key, Compare, KeyContainer&gt;&amp; y); // (1) C++26 + flat_multiset&lt;Key, Compare, KeyContainer&gt;&amp; y) + noexcept(noexcept(x.swap(y))); // (1) C++26 } ``` @@ -83,3 +84,5 @@ fs2 : {10, 20, 30} ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で、`noexcept`指定が条件付きに変更された。メンバ関数[`swap()`](swap.md)の`noexcept`条件に従う </code></pre> Akira Takahashi [email protected] flat_set -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_set/flat_set.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_set/flat_set.md b/reference/flat_set/flat_set.md index 13d6dd089..3b4957aaf 100644 --- a/reference/flat_set/flat_set.md +++ b/reference/flat_set/flat_set.md @@ -259,3 +259,5 @@ int main() - C++23で`flat_set`が導入された経緯・動機・設計について記載されている - [P1222R4 A Standard `flat_set`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1222r4.pdf) - C++23で導入された`flat_set`の仕様 +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で`swap`の条件付き`noexcept`、`insert_range`のソート済みオーバーロード追加などの修正が行われた </code></pre> Akira Takahashi [email protected] insert_range -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_set/flat_set/insert_range.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_set/flat_set/insert_range.md b/reference/flat_set/flat_set/insert_range.md index 7a83eae38..b7565537d 100644 --- a/reference/flat_set/flat_set/insert_range.md +++ b/reference/flat_set/flat_set/insert_range.md @@ -7,11 +7,15 @@ ```cpp template&lt;container-compatible-range&lt;value_type&gt; R&gt; -void insert_range(R&amp;&amp; rg); // (1) C++23 +void insert_range(R&amp;&amp; rg); // (1) C++23 template&lt;container-compatible-range&lt;value_type&gt; R&gt; -constexpr void insert_range(R&amp;&amp; rg); // (1) C++26 +constexpr void insert_range(R&amp;&amp; rg); // (1) C++26 + +template&lt;container-compatible-range&lt;value_type&gt; R&gt; +constexpr void insert_range(sorted_unique_t, R&amp;&amp; rg); // (2) C++26 ``` * container-compatible-range[link /reference/exposition-only/container-compatible-range.md] +* sorted_unique_t[link /reference/flat_set/sorted_unique_t.md] ## 概要 Rangeを挿入し、コンテナを拡張する。 @@ -25,12 +29,32 @@ Rangeを挿入し、コンテナを拡張する。 内部的に `flat_set` コンテナは、コンストラクト時に指定された比較オブジェクトによって要素を下位から上位へとソートして保持する。 +## 効果 +- (1) : メンバ変数として保持しているコンテナ`c`に、以下のように挿入する: + ```cpp + ranges::for_each(rg, [&amp;](auto&amp;&amp; e) { + c.insert(c.end(), std::forward&lt;decltype(e)&gt;(e)); + }); + ``` + * ranges::for_each[link /reference/algorithm/ranges_for_each.md] + * end()[link /reference/vector/vector/end.md] + * insert[link /reference/vector/vector/insert.md] + * std::forward[link /reference/utility/forward.md] + + - 次に、新しく挿入された要素の範囲を`value_comp()`を基準にソートする + - 次に、ソートされた結果の範囲と、既存の要素のソートされた範囲をひとつのソートされた範囲にマージする + - 最後に、重複する要素を削除する + +- (2) : `insert_range(rg)`と等価 + + ## 戻り値 なし ## 計算量 -- Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM +- (1) : Nをこの操作の前の[`size()`](size.md)、Mを[`ranges::distance`](/reference/iterator/ranges_distance.md)`(rg)`として、N + MlogM +- (2) : 線形 ## 備考 @@ -83,3 +107,5 @@ int main() ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で(2)の`sorted_unique_t`をとるオーバーロードが追加された </code></pre> Akira Takahashi [email protected] swap -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_set/flat_set/swap.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_set/flat_set/swap.md b/reference/flat_set/flat_set/swap.md index a7c466de9..2195c3446 100644 --- a/reference/flat_set/flat_set/swap.md +++ b/reference/flat_set/flat_set/swap.md @@ -6,9 +6,12 @@ * cpp23[meta cpp] ```cpp -void swap(flat_set&amp; y) noexcept; // (1) C++23 -constexpr void swap(flat_set&amp; y) noexcept; // (1) C++26 +void swap(flat_set&amp; y) noexcept; // (1) C++23 +constexpr void swap(flat_set&amp; y) + noexcept(is_nothrow_swappable_v&lt;container_type&gt; &amp;&amp; + is_nothrow_swappable_v&lt;key_compare&gt;); // (1) C++26 ``` +* is_nothrow_swappable_v[link /reference/type_traits/is_nothrow_swappable.md] ## 概要 コンテナ内のコンテンツを、同じ型の要素を保持する他の `flat_sest` オブジェクトである `y` 内のコンテンツと交換する。 @@ -78,3 +81,5 @@ fs2 : {10, 20, 30} ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で、`noexcept`指定が無条件から条件付きに変更された。内部コンテナと比較関数オブジェクトの`swap`が例外を送出しない場合にのみ`noexcept`となる </code></pre> Akira Takahashi [email protected] swap (非メンバ関数) -- C++26でのflat_map/set関連の仕様修正に対応 #1566 8d9f9ce276cbf9b592ea4101ceda0d52a411fab6:reference/flat_set/flat_set/swap_free.md 2026-03-13T11:25:45+09:00 <pre><code>diff --git a/reference/flat_set/flat_set/swap_free.md b/reference/flat_set/flat_set/swap_free.md index 2c3b707d9..fd2e418ef 100644 --- a/reference/flat_set/flat_set/swap_free.md +++ b/reference/flat_set/flat_set/swap_free.md @@ -13,7 +13,8 @@ namespace std { template &lt;class Key, class Compare, class KeyContainer&gt; constexpr void swap(flat_set&lt;Key, Compare, KeyContainer&gt;&amp; x, - flat_set&lt;Key, Compare, KeyContainer&gt;&amp; y); // (1) C++26 + flat_set&lt;Key, Compare, KeyContainer&gt;&amp; y) + noexcept(noexcept(x.swap(y))); // (1) C++26 } ``` @@ -83,3 +84,5 @@ fs2 : {10, 20, 30} ## 参照 - [P3372R3 constexpr containers and adaptors](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3372r3.html) +- [P3567R2 flat_meow Fixes](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3567r2.html) + - C++26で、`noexcept`指定が条件付きに変更された。メンバ関数[`swap()`](swap.md)の`noexcept`条件に従う </code></pre> Akira Takahashi [email protected] C++26 -- C++26対応としてapplyの戻り値型を取得するメタ関数を追加 #1522 fa239b65fd1b06b706d5a27ec711d5e0f66da5af:lang/cpp26.md 2026-03-12T11:15:34+09:00 <h1 itemprop="name"><span class="token">C++26</span></h1> <div itemprop="articleBody"><h2>概要</h2> <p>C++26とは、2026年中に改訂される予定の、C++バージョンの通称である。</p> <p>このバージョンは、策定中のためC++2cと呼ばれることがある。「(2020年代の3つ目のバージョンが) 202c年にリリースされる」という伏せ字として「c」が使われているが、3年周期に次のバージョンが策定されることが決まっているため、伏せ字になっている年数がずれることはない。</p> <h2>言語機能</h2> <h3>変数</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/static_storage_for_braced_initializers.html"><code>std::initializer_list</code>の配列を静的記憶域に配置する</a></td> <td><code>std::vector v = {1, 2, 3};</code>のような初期化で初期化子リストを静的記憶域に配置することで無駄なコピーをなくす</td> </tr> <tr> <td><a href="cpp26/nice_placeholder_with_no_name.html">宣言のみで使用しない変数の名前として<code>_</code>をサポート</a></td> <td>変数名<code>_</code>は暗黙で<code>[[maybe_unused]]</code>が指定される</td> </tr> <tr> <td><a href="cpp26/deleting_a_pointer_to_an_incomplete_type_should_be_ill-formed.html">不完全型へのポインタに対する<code>delete</code>を不適格とする</a></td> <td>未定義動作を引き起こす操作をコンパイルエラーとする</td> </tr> <tr> <td><a href="cpp26/disallow_binding_a_returned_glvalue_to_a_temporary.html">返却された左辺値から暗黙変換された一時オブジェクトが参照に束縛されることを禁止する</a></td> <td>寿命切れの変数によって引き起こされるバグを防止する</td> </tr> <tr> <td><a href="cpp26/clarifying_rules_for_brace_elision_in_aggregate_initialization.html">要素数不明の配列を集成体初期化する規則を明確化</a></td> <td>配列要素の集成体初期化で<code>{}</code>が省略された場合の矛盾していた規定を修正</td> </tr> <tr> <td><a href="cpp26/erroneous_behavior_for_uninitialized_reads.html">未初期化変数の読み取りをエラー性動作とする</a></td> <td>初期化されていない自動変数の読み取りの安全性を規定する</td> </tr> <tr> <td><a href="cpp26/structured_bindings_can_introduce_a_pack.html">構造化束縛でパックを導入できるようにする</a></td> <td>タプルを分解する際に複数の変数をパックとして宣言できるようにする。<code>auto [a, ...xs] = f();</code></td> </tr> </tbody> </table> <h3>文字列</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/making_non-encodable_string_literals_ill-formed.html">文字列リテラルの文字エンコーディング失敗を不適格とする</a></td> <td>文字列リテラルのエンコーディング時に文字表現が失われる場合にコンパイルエラーにする</td> </tr> <tr> <td><a href="cpp26/unevaluated_strings.md.nolink">コンパイル時にのみ使用される文字列の扱いを明確化</a></td> <td><code>static_assert</code>や<code>[[deprecated]]</code>などで使用されるコンパイル時の文字列について、文字コードの指定を禁止し、実行時エンコーディングが行われないことを規定</td> </tr> </tbody> </table> <h3>分岐・ループ</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/structured_binding_declaration_as_a_condition.html">条件式での構造化束縛の使用を許可</a></td> <td>式全体を<code>bool</code>値に変換できる場合に条件式で構造化束縛を使用できることとする</td> </tr> <tr> <td><a href="cpp26/trivial_infinite_loops_are_not_undefined_behavior.html">空の無限ループは未定義動作ではないと規定</a></td> <td>並行プログラムの進行保証などを考慮して空の無限ループを未定義動作ではないものとする</td> </tr> </tbody> </table> <h3>関数</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/delete_reason.html">関数宣言を削除する理由を指定できるようにする</a></td> <td><code>f() = delete("reason");</code></td> </tr> <tr> <td><a href="cpp26/contracts.html">契約プログラミングをサポートする</a></td> <td>関数の事前条件、事後条件、不変条件を記述できるようにする</td> </tr> </tbody> </table> <h3>クラス</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/trivial_unions.md.nolink">共用体をトリビアルに未初期化できるようにする</a></td> <td><code>constexpr</code>での<code>union U { T storage[N]; };</code>を許可し、未初期化にできるようにする</td> </tr> </tbody> </table> <h3>属性</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/on_the_ignorability_of_standard_attributes.html">属性の無視性を見直し</a></td> <td>構文として適格な属性のみを無視できるようにし、そうでない属性の使用を<a class="cpprefjp-defined-word">不適格</a>とする</td> </tr> <tr> <td><a href="cpp26/attributes_for_structured_bindings.html">構造化束縛への属性を許可</a></td> <td><code>auto [a, b [[maybe_unused]], c] = f();</code>のように構造化束縛の要素に対して属性を付加できるようにする</td> </tr> </tbody> </table> <h3>テンプレート</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/pack_indexing.html">パラメータパックへのインデックスアクセスを許可</a></td> <td>可変引数テンプレートのパラメータパックに添字アクセスできるようにする</td> </tr> <tr> <td><a href="cpp26/ordering_of_constraints_involving_fold_expressions.md.nolink">制約式内での畳み込み式の順序付け</a></td> <td>畳み込み式では全体ではなく個別の制約を原子制約式として扱う</td> </tr> <tr> <td><a href="cpp26/variadic_friends.html">可変引数テンプレートで<code>friend</code>宣言をできるようにする</a></td> <td>クラステンプレートの可変引数テンプレートでまとめて<code>friend</code>宣言できるようにする</td> </tr> <tr> <td><a href="cpp26/concept_and_variable-template_template-parameters.md.nolink">コンセプトと変数テンプレートにテンプレートテンプレートパラメータのサポートを追加</a></td> <td>テンプレート引数をあとで指定するテンプレートテンプレートパラメータを、コンセプトと変数テンプレートでも使用できるようにする</td> </tr> </tbody> </table> <h3>定数式</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/reflection.md.nolink">静的リフレクション</a></td> <td>リフレクション演算子<code>^^</code>と<code>std::meta::info</code>型によりコンパイル時にさまざまな情報を取得できる</td> </tr> <tr> <td><a href="cpp26/expansion_statements.md.nolink">コンパイル時のタプルやリストを展開処理する<code>template for</code>文</a></td> <td>クラス・タプル・Range・パラメータパックなどを展開してすべての要素をコンパイル時の処理する<code>template for</code>文を追加</td> </tr> <tr> <td><a href="cpp26/constexpr_cast_from_voidptr.html">定数式での<code>void*</code>からポインタ型へのキャストを許可</a></td> <td>型消去のために<code>void*</code>からポインタ型へのキャストを許可する</td> </tr> <tr> <td><a href="cpp26/user-generated_static_assert_messages.html"><code>static_assert</code>の診断メッセージにユーザーが生成した文字列の指定を許可</a></td> <td><code>constexpr</code>な<code>S.size()</code>と<code>S.data()</code>メンバ関数をもつオブジェクトをコンパイル時文字列として指定できるようにする</td> </tr> <tr> <td><a href="cpp26/constexpr_placement_new.html"><code>constexpr</code>配置<code>new</code></a></td> <td>定数式の文脈での配置<code>new</code>を許可</td> </tr> <tr> <td><a href="cpp26/constexpr_structured_bindings_and_references_to_constexpr_variables.html"><code>constexpr</code>構造化束縛の許可と、<code>constexpr</code>参照の制限緩和</a></td> <td>定数式に対する構造化束縛を許可し、関連して<code>constexpr</code>参照の制限を緩和して自動変数も参照できるようにする</td> </tr> <tr> <td><a href="cpp26/allowing_exception_throwing_in_constant-evaluation.html">定数評価での例外送出を許可</a></td> <td>定数式の文脈での例外の送出と捕捉を許可</td> </tr> <tr> <td><a href="cpp26/constexpr_virtual_inheritance.md.nolink"><code>constexpr</code>仮想継承を許可</a></td> <td>定数式の文脈での仮想継承を許可</td> </tr> </tbody> </table> <h3>プリプロセッサ</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/embed.html">ファイルを読み込む<code>#embed</code>命令を追加</a></td> <td>バイナリファイルをインクルードするメカニズム。<code>#include</code>とちがって読み出しサイズなどの柔軟な指定ができる</td> </tr> <tr> <td><a href="cpp26/preprocessing_is_never_undefined.md.nolink">プリプロセッサ仕様での「未定義動作」を不適格 (診断不要) に変更</a></td> <td>プリプロセッサとレキサーの文脈での「未定義動作」用語を<a class="cpprefjp-defined-word">不適格</a> (診断不要) に変更</td> </tr> </tbody> </table> <h3>ソースコード</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/add_atsign_dollar_graveaccent_to_the_basic_character_set.html">基本文字集合に@、$、`を追加</a></td> <td>C言語との互換性のためにこれらの文字を基本文字集合に追加</td> </tr> </tbody> </table> <h3>モジュール</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/module_declarations_shouldnt_be_macros.html">モジュール宣言でのモジュール名のマクロ展開を禁止する</a></td> <td><code>export module MACRO_NAME;</code>を禁止</td> </tr> <tr> <td><a href="cpp26/allow_attaching_main_to_the_global_module.md.nolink"><code>main</code>関数をグローバルモジュールに含められるようにする</a></td> <td><code>main</code>関数に<code>extern "C++"</code>を指定できるようにすることで名前付きモジュールに含められるようにする</td> </tr> <tr> <td><a href="cpp26/allow_line_before_module_declarations.md.nolink">モジュール宣言より前での<code>#line</code>ディレクティブの使用を許可する</a></td> <td>モジュール宣言より前での<code>#line</code>ディレクティブの使用を禁止していたのは過度な制限だった</td> </tr> </tbody> </table> <h3>機能の非推奨化</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/the_oxford_variadic_comma.html">先行するカンマのない省略記号を非推奨化</a></td> <td><code>void f(int, ...);</code>はOK。<code>void f(int...);</code>は非推奨</td> </tr> </tbody> </table> <h3>機能の削除</h3> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>言語機能</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td><a href="cpp26/remove_deprecated_array_comparisons.html">非推奨だった組み込み配列の比較を削除</a></td> <td>C++20で非推奨となっていた配列比較を削除</td> </tr> <tr> <td><a href="cpp26/remove_deprecated_arithmetic_conversion_on_enumerations.html">非推奨となっていた列挙型の算術変換を削除</a></td> <td>C++20から非推奨となっていた列挙値への算術演算で算術型に暗黙変換される仕様を削除</td> </tr> </tbody> </table> <h2>ライブラリ更新の概要</h2> <h3>新ライブラリ</h3> <ul> <li>文字列エンコーディングを識別するライブラリとして、<code><a href="../reference/text_encoding.md.nolink">&lt;text_encoding&gt;</a></code>を追加</li> <li>要素のメモリ位置が安定するシーケンスコンテナのライブラリとして<code><a href="../reference/hive.md.nolink">&lt;hive&gt;</a></code>を追加</li> <li>並行処理におけるデータの参照・更新を行うRCU (Read Copy Update) のライブラリとして、<code><a href="../reference/rcu.html">&lt;rcu&gt;</a></code>を追加</li> <li>並行処理において参照中のデータが更新されないよう保護するハザードポインタのライブラリとして、<code><a href="../reference/hazard_pointer.md.nolink">&lt;hazard_pointer&gt;</a></code>を追加</li> <li>データ並列ライブラリとして、<code><a href="../reference/simd.md.nolink">&lt;simd&gt;</a></code>を追加</li> <li>デバッグサポートのライブラリとして<code><a href="../reference/debugging.html">&lt;debugging&gt;</a></code>を追加</li> <li>線形代数ライブラリとして<code><a href="../reference/linalg.html">&lt;linalg&gt;</a></code>を追加</li> <li>コンパイル時に容量を固定する可変長配列クラスのライブラリとして<code><a href="../reference/inplace_vector.md.nolink">&lt;inplace_vector&gt;</a></code>を追加</li> <li>C23の互換ライブラリとして、ビット操作ライブラリ<code><a href="../reference/stdbit.h.md.nolink">&lt;stdbit.h&gt;</a></code>と、検査付き整数演算ライブラリ<code><a href="../reference/stdckdint.h.md.nolink">&lt;stdckdint.h&gt;</a></code>を追加。<code>&lt;cstd…&gt;</code>形式のライブラリは追加されない</li> </ul> <h3>全体</h3> <ul> <li>標準ライブラリに付加された、戻り値を無視した際に警告を出力する<a href="cpp17/nodiscard.html"><code>[[nodiscard]]</code>属性</a>を削除</li> </ul> <h3>コンテナ</h3> <ul> <li><code><a href="../reference/vector/vector.html">std::vector&lt;bool&gt;::reference</a></code>のプロキシ操作として、<code>const</code>修飾付きの代入と<code>swap()</code>メンバ関数を追加</li> <li><code><a href="../reference/mdspan/mdspan.html">std::mdspan</a></code>から部分ビューを取り出す<code><a href="../reference/mdspan/submdspan.html">std::submdspan()</a></code>を追加</li> <li><code><a href="../reference/mdspan/mdspan.html">std::mdspan</a></code>に、インデックスを指定して要素を取り出す<code><a href="../reference/mdspan/mdspan/at.html">at()</a></code>メンバ関数を追加</li> <li><code><a href="../reference/mdspan/mdspan.html">std::mdspan</a></code>に対する<code><a href="../reference/mdspan/extents.html">std::dextents</a></code>指定の冗長さを解決する<code><a href="../reference/mdspan/extents.html">std::dims</a></code>を追加</li> <li><code><a href="../reference/mdspan/mdspan.html">std::mdspan</a></code>のレイアウトとして、<code><a href="../reference/mdspan/layout_left_padded.html">std::layout_left_padded</a></code>と<code><a href="../reference/mdspan/layout_right_padded.html">std::layout_right_padded</a></code>を追加</li> <li><code><a href="../reference/mdspan.html">&lt;mdspan&gt;</a></code>に、要素アクセスにアライメント保証を与える<code><a href="../reference/mdspan/aligned_accessor.html">std::aligned_accessor</a></code>を追加</li> <li><code><a href="../reference/span/span.html">std::span</a></code>に、以下を追加<ul> <li><code><a href="../reference/initializer_list/initializer_list.html">std::initializer_list</a></code>をとるコンストラクタ</li> <li>インデックスアクセスのための<code><a href="../reference/span/span/at.html">at()</a></code>メンバ関数</li> </ul> </li> <li>連想コンテナの以下のメンバ関数に、一時オブジェクトが生成されるコストを抑える拡張を追加<ul> <li><code><a href="../reference/map/map.html">std::map</a></code><ul> <li><code><a href="../reference/map/map/op_at.html">operator[]</a></code></li> <li><code><a href="../reference/map/map/at.html">at()</a></code></li> <li><code><a href="../reference/map/map/try_emplace.html">try_emplace()</a></code></li> <li><code><a href="../reference/map/map/insert_or_assign.html">insert_or_assign()</a></code></li> </ul> </li> <li><code><a href="../reference/set/set.html">std::set</a></code><ul> <li><code><a href="../reference/set/set/insert.html">insert()</a></code></li> </ul> </li> <li><code><a href="../reference/unordered_map/unordered_map.html">std::unordered_map</a></code><ul> <li><code><a href="../reference/unordered_map/unordered_map/op_at.html">operator[]</a></code></li> <li><code><a href="../reference/unordered_map/unordered_map/at.html">at()</a></code></li> <li><code><a href="../reference/unordered_map/unordered_map/try_emplace.html">try_emplace()</a></code></li> <li><code><a href="../reference/unordered_map/unordered_map/insert_or_assign.html">insert_or_assign()</a></code></li> <li><code><a href="../reference/unordered_map/unordered_map/bucket.html">bucket()</a></code></li> </ul> </li> <li><code><a href="../reference/unordered_map/unordered_multimap.html">std::unordered_multimap</a></code><ul> <li><code><a href="../reference/unordered_map/unordered_multimap/bucket.html">bucket()</a></code></li> </ul> </li> <li><code><a href="../reference/unordered_set/unordered_set.html">std::unordered_set</a></code><ul> <li><code><a href="../reference/unordered_set/unordered_set/insert.html">insert()</a></code></li> <li><code><a href="../reference/unordered_set/unordered_set/bucket.html">bucket()</a></code></li> </ul> </li> <li><code><a href="../reference/unordered_set/unordered_multiset.html">std::unordered_multiset</a></code><ul> <li><code><a href="../reference/unordered_set/unordered_multiset/bucket.html">bucket()</a></code></li> </ul> </li> </ul> </li> <li><code><a href="../reference/span/span.html">std::span</a></code>と<code><a href="../reference/mdspan/mdspan.html">std::mdspan</a></code>の推論補助を改善</li> <li><code><a href="../reference/ranges/concat_view.html">std::views::concat</a></code>を追加</li> <li><code><a href="../reference/ranges/cache_latest.md.nolink">std::views::cache_latest</a></code>を追加</li> <li><code><a href="../reference/ranges/to_input_view.html">std::views::to_input</a></code>を追加。これはパフォーマンス向上のために、Rangeを入力Rangeかつ非<code><a href="../reference/ranges/common_range.html">common_range</a></code> (イテレータと番兵の型を別する) に変換する</li> <li>Range関係の、償却定数時間での要素追加を行う機能を追加<ul> <li>各viewクラスに<code>reserve_hint()</code>メンバ関数を追加</li> <li><code><a href="../reference/ranges/reserve_hint.md.nolink">std::ranges::reserve_hint()</a></code>関数を追加</li> <li><code><a href="../reference/ranges/approximately_sized_range.md.nolink">std::ranges::approximately_sized_range</a></code>コンセプトを追加</li> </ul> </li> <li>インデックス列を生成する<code><a href="../reference/ranges/indices.md.nolink">std::views::indices</a></code>を追加</li> <li>連続イテレータのコンセプト<code><a href="../reference/iterator/contiguous_iterator.html">contiguous_iterator</a></code>に、ポインタに変換できることを要件として追加</li> <li><code><a href="../reference/initializer_list/initializer_list.html">std::initializer_list</a></code>クラスを以下のように変更<ul> <li>独自に定義されていた<code><a href="../reference/initializer_list/initializer_list/begin_free.html">std::begin()</a></code> / <code><a href="../reference/initializer_list/initializer_list/end_free.html">std::end()</a></code>のオーバーロードを削除 (<code>std::cbegin()</code>や<code>std::rend()</code>のようなオーバーロードがなかったため、ほかとの不整合があった)</li> <li>メンバ関数<code><a href="../reference/initializer_list/initializer_list/data.html">data()</a></code>を追加</li> <li>メンバ関数<code><a href="../reference/initializer_list/initializer_list/empty.html">empty()</a></code>を追加</li> </ul> </li> <li><code><a href="../reference/valarray/valarray.html">std::valarray</a></code>クラスを以下のように変更<ul> <li>独自に定義されていた<code><a href="../reference/valarray/valarray/begin_free.html">std::begin()</a></code> / <code><a href="../reference/valarray/valarray/end_free.html">std::end()</a></code>のオーバーロードを削除 (<code>std::cbegin()</code>や<code>std::rend()</code>のようなオーバーロードがなかったため、ほかとの不整合があった)</li> <li>メンバ型<code>iterator</code> / <code>const_iterator</code>を追加</li> <li>メンバ関数<code><a href="../reference/valarray/valarray/begin.html">begin()</a></code> / <code><a href="../reference/valarray/valarray/end.html">end()</a></code>を追加</li> </ul> </li> <li>イテレータインタフェースの非メンバ関数<code><a href="../reference/iterator/begin.html">std::begin()</a></code> / <code><a href="../reference/iterator/end.html">std::end()</a></code> / <code><a href="../reference/iterator/cbegin.html">std::cbegin()</a></code> / <code><a href="../reference/iterator/cend.html">std::cend()</a></code> / <code><a href="../reference/iterator/rbegin.html">std::rbegin()</a></code> / <code><a href="../reference/iterator/rend.html">std::rend()</a></code> / <code><a href="../reference/iterator/crbegin.html">std::crbegin()</a></code> / <code><a href="../reference/iterator/crend.html">std::crend()</a></code> / <code><a href="../reference/iterator/size.html">std::size()</a></code> / <code><a href="../reference/iterator/ssize.html">std::ssize()</a></code> / <code><a href="../reference/iterator/empty.html">std::empty()</a></code> / <code><a href="../reference/iterator/data.html">std::data()</a></code>を以下のように変更<ul> <li><code><a href="../reference/initializer_list/initializer_list.html">std::initializer_list</a></code>型に対するオーバーロードを削除 (専用のオーバーロードを用意しなくても汎用オーバーロードが使用できるようになった)</li> <li>条件付き<code>noexcept</code>指定を追加</li> </ul> </li> <li>Rangeインタフェースの非メンバ関数<code><a href="../reference/ranges/begin.html">std::ranges::begin()</a></code> / <code><a href="../reference/ranges/end.html">std::ranges::end()</a></code> / <code><a href="../reference/ranges/cbegin.html">std::ranges::cbegin()</a></code> / <code><a href="../reference/ranges/cend.html">std::ranges::cend()</a></code> / <code><a href="../reference/ranges/rbegin.html">std::ranges::rbegin()</a></code> / <code><a href="../reference/ranges/rend.html">std::ranges::rend()</a></code> / <code><a href="../reference/ranges/crbegin.html">std::ranges::crbegin()</a></code> / <code><a href="../reference/ranges/crend.html">std::ranges::crend()</a></code> / <code><a href="../reference/ranges/size.html">std::ranges::size()</a></code> / <code><a href="../reference/ranges/ssize.html">std::ranges::ssize()</a></code> / <code><a href="../reference/ranges/empty.html">std::ranges::empty()</a></code> / <code><a href="../reference/ranges/data.html">std::ranges::data()</a></code>を以下のように変更<ul> <li><code><a href="../reference/initializer_list/initializer_list.html">std::initializer_list</a></code>型に対するオーバーロードを削除 (専用のオーバーロードを用意しなくても汎用オーバーロードが使用できるようになった)</li> <li>条件付き<code>noexcept</code>指定を追加</li> </ul> </li> <li>以下のコンテナを<code>constexpr</code>に対応<ul> <li><code><a href="../reference/deque/deque.html">std::deque</a></code></li> <li><code><a href="../reference/forward_list/forward_list.html">std::forward_list</a></code></li> <li><code><a href="../reference/list/list.html">std::list</a></code></li> <li><code><a href="../reference/map/map.html">std::map</a></code> (ただし<code><a href="../reference/node_handle/node_handle.html">node_handle</a>::<a href="../reference/node_handle/node_handle/key.html">key()</a></code>を使用すると未定義動作)</li> <li><code><a href="../reference/map/multimap.html">std::multimap</a></code> (ただし<code><a href="../reference/node_handle/node_handle.html">node_handle</a>::<a href="../reference/node_handle/node_handle/key.html">key()</a></code>を使用すると未定義動作)</li> <li><code><a href="../reference/set/set.html">std::set</a></code></li> <li><code><a href="../reference/set/multiset.html">std::multiset</a></code></li> <li><code><a href="../reference/unordered_map/unordered_map.html">std::unordered_map</a></code> (ハッシュ関数のカスタム化が必要) (ただし<code><a href="../reference/node_handle/node_handle.html">node_handle</a>::<a href="../reference/node_handle/node_handle/key.html">key()</a></code>を使用すると未定義動作)</li> <li><code><a href="../reference/unordered_map/unordered_multimap.html">std::unordered_multimap</a></code> (ハッシュ関数のカスタム化が必要) (ただし<code><a href="../reference/node_handle/node_handle.html">node_handle</a>::<a href="../reference/node_handle/node_handle/key.html">key()</a></code>を使用すると未定義動作)</li> <li><code><a href="../reference/unordered_set/unordered_set.html">std::unordered_set</a></code> (ハッシュ関数のカスタム化が必要)</li> <li><code><a href="../reference/unordered_set/unordered_multiset.html">std::unordered_multiset</a></code> (ハッシュ関数のカスタム化が必要)</li> <li><code><a href="../reference/flat_map/flat_map.html">std::flat_map</a></code></li> <li><code><a href="../reference/flat_map/flat_multimap.html">std::flat_multimap</a></code></li> <li><code><a href="../reference/flat_set/flat_set.html">std::flat_set</a></code></li> <li><code><a href="../reference/flat_set/flat_multiset.html">std::flat_multiset</a></code></li> <li><code><a href="../reference/queue/queue.html">std::queue</a></code></li> <li><code><a href="../reference/queue/priority_queue.html">std::priority_queue</a></code></li> <li><code><a href="../reference/stack/stack.html">std::stack</a></code></li> </ul> </li> </ul> <h3>アルゴリズム</h3> <ul> <li><code><a href="../reference/algorithm.html">&lt;algorithm&gt;</a></code>と<code><a href="../reference/memory.html">&lt;memory&gt;</a></code>のアルゴリズムを並列実行に対応</li> <li><code><a href="../reference/algorithm.html">&lt;algorithm&gt;</a></code>の以下のアルゴリズムを<code>constexpr</code>に対応<ul> <li><code><a href="../reference/algorithm/stable_sort.html">std::stable_sort()</a></code> / <code><a href="../reference/algorithm/ranges_stable_sort.html">std::ranges::stable_sort()</a></code></li> <li><code><a href="../reference/algorithm/stable_partition.html">std::stable_partition()</a></code> / <code><a href="../reference/algorithm/ranges_stable_partition.html">std::ranges::stable_partition()</a></code></li> <li><code><a href="../reference/algorithm/inplace_merge.html">std::inplace_merge()</a></code> / <code><a href="../reference/algorithm/ranges_inplace_merge.html">std::ranges::inplace_merge()</a></code></li> </ul> </li> <li><code><a href="../reference/memory.html">&lt;memory&gt;</a></code>の以下のアルゴリズムを<code>constexpr</code>に対応<ul> <li><code><a href="../reference/memory/uninitialized_default_construct.html">std::uninitialized_default_construct()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_default_construct.html">std::ranges::uninitialized_default_construct()</a></code></li> <li><code><a href="../reference/memory/uninitialized_default_construct_n.html">std::uninitialized_default_construct_n()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_default_construct_n.html">std::ranges::uninitialized_default_construct_n()</a></code></li> <li><code><a href="../reference/memory/uninitialized_value_construct.html">std::uninitialized_value_construct()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_value_construct.html">std::ranges::uninitialized_value_construct()</a></code></li> <li><code><a href="../reference/memory/uninitialized_value_construct_n.html">std::uninitialized_value_construct_n()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_value_construct_n.html">std::ranges::uninitialized_value_construct_n()</a></code></li> <li><code><a href="../reference/memory/uninitialized_copy.html">std::uninitialized_copy()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_copy.html">std::ranges::uninitialized_copy()</a></code></li> <li><code><a href="../reference/memory/uninitialized_copy_n.html">std::uninitialized_copy_n()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_copy_n.html">std::ranges::uninitialized_copy_n()</a></code></li> <li><code><a href="../reference/memory/uninitialized_move.html">std::uninitialized_move()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_move.html">std::ranges::uninitialized_move()</a></code></li> <li><code><a href="../reference/memory/uninitialized_move_n.html">std::uninitialized_move_n()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_move_n.html">std::ranges::uninitialized_move_n()</a></code></li> <li><code><a href="../reference/memory/uninitialized_fill.html">std::uninitialized_fill()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_fill.html">std::ranges::uninitialized_fill()</a></code></li> <li><code><a href="../reference/memory/uninitialized_fill_n.html">std::uninitialized_fill_n()</a></code> / <code><a href="../reference/memory/ranges_uninitialized_fill_n.html">std::ranges::uninitialized_fill_n()</a></code></li> </ul> </li> <li>Rangeアルゴリズムが完全型を要求しないようにするため、<code><a href="../reference/iterator/projected.html">std::projected</a></code>の制約を緩和</li> <li>以下のアルゴリズムに、値を波カッコ初期化で渡せるよう制約を追加<ul> <li><code>std::erase()</code><ul> <li><code><a href="../reference/string/basic_string.html">std::basic_string</a></code>版<code><a href="../reference/string/basic_string/erase_free.html">std::erase()</a></code></li> <li><code><a href="../reference/deque/deque.html">std::deque</a></code>版<code><a href="../reference/deque/deque/erase_free.html">std::erase()</a></code></li> <li><code><a href="../reference/forward_list/forward_list.html">std::forward_list</a></code>版<code><a href="../reference/forward_list/forward_list/erase_free.html">std::erase()</a></code></li> <li><code><a href="../reference/list/list.html">std::list</a></code>版<code><a href="../reference/list/list/erase_free.html">std::erase()</a></code></li> <li><code><a href="../reference/vector/vector.html">std::vector</a></code>版<code><a href="../reference/vector/vector/erase_free.html">std::erase()</a></code></li> </ul> </li> <li><code><a href="../reference/algorithm/find.html">std::find()</a></code>と<code><a href="../reference/algorithm/ranges_find.html">std::ranges::find()</a></code></li> <li><code><a href="../reference/algorithm/ranges_find_last.html">std::ranges::find_last()</a></code></li> <li><code><a href="../reference/algorithm/count.html">std::count()</a></code>と<code><a href="../reference/algorithm/ranges_count.html">std::ranges::count()</a></code></li> <li><code><a href="../reference/algorithm/search_n.html">std::search_n()</a></code>と<code><a href="../reference/algorithm/ranges_search_n.html">std::ranges::search_n()</a></code></li> <li><code><a href="../reference/algorithm/replace.html">std::replace()</a></code>と<code><a href="../reference/algorithm/replace.html">std::ranges::replace()</a></code></li> <li><code><a href="../reference/algorithm/replace_if.html">std::replace_if()</a></code>と<code><a href="../reference/algorithm/replace_if.html">std::ranges::replace_if()</a></code></li> <li><code><a href="../reference/algorithm/replace_copy.html">std::ranges::replace_copy()</a></code></li> <li><code><a href="../reference/algorithm/replace_copy_if.html">std::replace_copy_if()</a></code>と<code><a href="../reference/algorithm/replace_copy_if.html">std::ranges::replace_copy_if()</a></code></li> <li><code><a href="../reference/algorithm/fill.html">std::fill()</a></code>と<code><a href="../reference/algorithm/ranges_fill.html">std::ranges::fill()</a></code></li> <li><code><a href="../reference/algorithm/fill_n.html">std::fill_n()</a></code>と<code><a href="../reference/algorithm/ranges_fill_n.html">std::ranges::fill_n()</a></code></li> <li><code><a href="../reference/algorithm/remove.html">std::remove()</a></code>と<code><a href="../reference/algorithm/ranges_remove.html">std::ranges::remove()</a></code></li> <li><code><a href="../reference/algorithm/remove_copy.html">std::remove_copy()</a></code>と<code><a href="../reference/algorithm/ranges_remove_copy.html">std::ranges::remove_copy()</a></code></li> <li><code><a href="../reference/algorithm/lower_bound.html">std::lower_bound()</a></code>と<code><a href="../reference/algorithm/ranges_lower_bound.html">std::ranges::lower_bound()</a></code></li> <li><code><a href="../reference/algorithm/upper_bound.html">std::upper_bound()</a></code>と<code><a href="../reference/algorithm/ranges_upper_bound.html">std::ranges::upper_bound()</a></code></li> <li><code><a href="../reference/algorithm/equal_range.html">std::equal_range()</a></code>と<code><a href="../reference/algorithm/ranges_equal_range.html">std::ranges::equal_range()</a></code></li> <li><code><a href="../reference/algorithm/binary_search.html">std::binary_search()</a></code>と<code><a href="../reference/algorithm/ranges_binary_search.html">std::ranges::binary_search()</a></code></li> <li><code><a href="../reference/algorithm/ranges_fold_left.html">std::ranges::fold_left()</a></code></li> <li><code><a href="../reference/algorithm/ranges_fold_right.html">std::ranges::fold_right()</a></code></li> <li><code><a href="../reference/algorithm/ranges_contains.html">std::ranges::contains()</a></code></li> </ul> </li> </ul> <h3>関数オブジェクト</h3> <ul> <li>所有権を保持しない<code><a href="../reference/functional/function.html">std::function</a></code>として、<code><a href="../reference/functional.html">&lt;functional&gt;</a></code>に<code><a href="../reference/functional/function_ref.html">std::function_ref</a></code>クラスを追加</li> <li><code><a href="../reference/functional/move_only_function.html">std::move_only_function</a></code>のコピー可能版として、<code><a href="../reference/functional.html">&lt;functional&gt;</a></code>に<code><a href="../reference/functional/copyable_function.html">std::copyable_function</a></code>クラスを追加</li> <li><code><a href="../reference/functional/bind_front.html">std::bind_front()</a></code>と<code><a href="../reference/functional/bind_back.html">std::bind_back()</a></code>に、非型テンプレート引数として関数を指定するオーバーロードを追加<ul> <li>関連して、非型テンプレート引数の関数オブジェクトを反転させられるよう、<code><a href="../reference/functional/not_fn.html">not_fn()</a></code>に非型テンプレート引数版のオーバーロードを追加</li> </ul> </li> <li><code><a href="../reference/functional/reference_wrapper.html">std::reference_wrapper</a></code>に、比較演算子<code><a href="../reference/functional/reference_wrapper/op_equal.html">==</a></code>と<code><a href="../reference/functional/reference_wrapper/op_compare_3way.html">&lt;=&gt;</a></code>を追加</li> </ul> <h3>文字列</h3> <ul> <li><code><a href="../reference/charconv.html">&lt;charconv&gt;</a></code>の変換結果<code><a href="../reference/charconv/to_chars_result.html">std::to_chars_result</a></code>と<code><a href="../reference/charconv/from_chars_result.html">std::from_chars_result</a></code>に、変換が正しく完了したかを判定する<code>operator bool</code>を追加</li> <li><code><a href="../reference/string/to_string.html">std::to_string()</a></code>の仕様が<code>std::sprintf()</code>で説明されていたが、<code><a href="../reference/format/format.html">std::format()</a></code>で定義するよう仕様を変更</li> <li><code><a href="../reference/sstream/basic_istringstream.html">std::basic_istringstream</a></code>および<code><a href="../reference/sstream/basic_ostringstream.html">std::basic_ostringstream</a></code>のコンストラクタおよび<code>str()</code>メンバ関数に、<code><a href="../reference/string_view/basic_string_view.html">std::basic_string_view</a></code>を受け取るオーバーロードを追加</li> <li><code><a href="../reference/format/format.html">std::format()</a></code>に、以下の改善を導入<ul> <li>ポインタ出力のサポートを追加</li> <li>幅と精度を動的に指定した場合でも型の検証がコンパイル時に行われるよう仕様を見直し</li> <li>コンパイル時の書式文字列だけでなく、実行時の書式文字列を渡せるよう仕様修正</li> <li>非ロケール版を<code>constexpr</code>に対応</li> </ul> </li> <li><code><a href="../reference/string/to_string.html">std::to_string()</a></code>と<code><a href="../reference/string/to_wstring.html">std::to_wstring()</a></code>の整数オーバーロードが<code>constexpr</code>に対応</li> <li><code><a href="../reference/string/basic_string.html">std::basic_string</a></code>クラスと<code><a href="../reference/string_view/basic_string_view.html">std::basic_string_view</a></code>クラスに、部分文字列を<code><a href="../reference/string_view/basic_string_view.html">std::basic_string_view</a></code>として取得するメンバ関数<code>subview()</code>を追加</li> <li><code><a href="../reference/string/basic_string.html">std::basic_string</a></code>と<code><a href="../reference/string_view/basic_string_view.html">std::basic_string_view</a></code>を<code><a href="../reference/string/basic_string.html">std::basic_string</a></code>として連結させる<code>operator+</code>を追加</li> </ul> <h3>ファイル</h3> <ul> <li>ファイルのネイティブハンドルを取得できるよう、<code><a href="../reference/fstream/basic_filebuf.html">std::basic_filebuf</a></code>、<code><a href="../reference/fstream/basic_ifstream.html">std::basic_ifstream</a></code>、<code><a href="../reference/fstream/basic_ofstream.html">std::basic_ofstream</a></code>、<code><a href="../reference/fstream/basic_fstream.html">std::basic_fstream</a></code>クラスに、以下のメンバを追加<ul> <li><code>native_handle_type</code>型</li> <li><code>native_handle()</code></li> </ul> </li> <li><code><a href="../reference/filesystem/path.html">std::filesystem::path</a></code>クラスに、文字列フォーマットのサポートを追加</li> <li><code><a href="../reference/filesystem/path.html">std::filesystem::path</a></code>クラスに、出力用の文字列を取得するための、以下のメンバ関数を追加<ul> <li><code><a href="../reference/filesystem/path/display_string.md.nolink">display_string()</a></code></li> <li><code><a href="../reference/filesystem/path/system_encoded_string.md.nolink">system_encoded_string()</a></code></li> <li><code><a href="../reference/filesystem/path/generic_display_string.md.nolink">generic_display_string()</a></code></li> <li><code><a href="../reference/filesystem/path/generic_system_encoded_string.md.nolink">generic_system_encoded_string()</a></code></li> </ul> </li> </ul> <h3>入出力</h3> <ul> <li><code><a href="../reference/print/print.html">std::print()</a></code>と<code><a href="../reference/print/println.html">std::println()</a></code>に、ロックを取得せず高速に書き出す最適化を許可</li> <li><code><a href="../reference/print/println.html">std::println()</a></code>に、改行のみを出力するオーバーロードを追加</li> <li><code><a href="../reference/print/print.html">std::print()</a></code>と<code><a href="../reference/print/println.html">std::println()</a></code>をより高速にできる最適化が可能か判定する<code><a href="../reference/format/enable_nonlocking_formatter_optimization.html">std::enable_nonlocking_formatter_optimization</a></code>を追加</li> <li><code><a href="../reference/istream/basic_istream.html">std::basic_istream</a>::<a href="../reference/istream/basic_istream/ignore.html">ignore()</a></code>メンバ関数に、区切り文字として<code>char</code>型をとるオーバーロードを追加</li> </ul> <h3>並行・並列・非同期処理</h3> <ul> <li><code><a href="../reference/execution.html">&lt;execution&gt;</a></code>に汎用的な非同期実行を管理するフレームワークを追加</li> <li><code><a href="../reference/atomic/atomic.html">std::atomic</a></code>オブジェクトに対する2つの値の最大値・最小値を取得する関数として、以下を追加<ul> <li>メンバ関数<ul> <li><code><a href="../reference/atomic/atomic/fetch_max.html">fetch_max()</a></code></li> <li><code><a href="../reference/atomic/atomic/fetch_min.html">fetch_min()</a></code></li> <li><code><a href="../reference/atomic/atomic/fetch_fmaximum.html">fetch_fmaximum()</a></code> (浮動小数点数用)</li> <li><code><a href="../reference/atomic/atomic/fetch_fminimum.html">fetch_fminimum()</a></code> (浮動小数点数用)</li> <li><code><a href="../reference/atomic/atomic/fetch_fmaximum_num.html">fetch_fmaximum_num()</a></code> (浮動小数点数用)</li> <li><code><a href="../reference/atomic/atomic/fetch_fminimum_num.html">fetch_fminimum_num()</a></code> (浮動小数点数用)</li> </ul> </li> <li>非メンバ関数として<ul> <li><code><a href="../reference/atomic/atomic_fetch_max.html">std::atomic_fetch_max()</a></code></li> <li><code><a href="../reference/atomic/atomic_fetch_max_explicit.html">std::atomic_fetch_max_explicit()</a></code></li> <li><code><a href="../reference/atomic/atomic_fetch_min.html">std::atomic_fetch_min()</a></code></li> <li><code><a href="../reference/atomic/atomic_fetch_min_explicit.html">std::atomic_fetch_min_explicit()</a></code></li> </ul> </li> </ul> </li> <li><code><a href="../reference/atomic/atomic.html">std::atomic</a></code>クラスと<code><a href="../reference/atomic/atomic_ref.html">std::atomic_ref</a></code>クラスに、現在の値を読み込まず (fetchせず) に加算などをする高速な縮約用の操作として、以下を追加<ul> <li>メンバ関数<ul> <li><code><a href="../reference/atomic/atomic/store_add.html">store_add()</a></code></li> <li><code><a href="../reference/atomic/atomic/store_sub.html">store_sub()</a></code></li> <li><code><a href="../reference/atomic/atomic/store_and.html">store_and()</a></code></li> <li><code><a href="../reference/atomic/atomic/store_or.html">store_or()</a></code></li> <li><code><a href="../reference/atomic/atomic/store_xor.html">store_xor()</a></code></li> <li><code><a href="../reference/atomic/atomic/store_max.html">store_max()</a></code></li> <li><code><a href="../reference/atomic/atomic/store_min.html">store_min()</a></code></li> <li><code><a href="../reference/atomic/atomic/store_fmaximum.html">store_fmaximum()</a></code> (浮動小数点数用)</li> <li><code><a href="../reference/atomic/atomic/store_fminimum.html">store_fminimum()</a></code> (浮動小数点数用)</li> <li><code><a href="../reference/atomic/atomic/store_fmaximum_num.html">store_fmaximum_num()</a></code> (浮動小数点数用)</li> <li><code><a href="../reference/atomic/atomic/store_fminimum_num.html">store_fminimum_num()</a></code> (浮動小数点数用)</li> </ul> </li> <li>非メンバ関数<ul> <li><code><a href="../reference/atomic/atomic_store_add.html">std::atomic_store_add()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_add_explicit.html">std::atomic_store_add_explicit()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_sub.html">std::atomic_store_sub()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_sub_explicit.html">std::atomic_store_sub_explicit()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_and.html">std::atomic_store_and()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_and_explicit.html">std::atomic_store_and_explicit()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_or.html">std::atomic_store_or()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_or_explicit.html">std::atomic_store_or_explicit()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_xor.html">std::atomic_store_xor()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_xor_explicit.html">std::atomic_store_xor_explicit()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_max.html">std::atomic_store_max()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_max_explicit.html">std::atomic_store_max_explicit()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_min.html">std::atomic_store_min()</a></code></li> <li><code><a href="../reference/atomic/atomic_store_min_explicit.html">std::atomic_store_min_explicit()</a></code></li> </ul> </li> </ul> </li> <li><code><a href="../reference/atomic/atomic_ref.html">std::atomic_ref</a></code>クラスに、参照するオブジェクトのアドレスを取得する<code><a href="../reference/atomic/atomic_ref/address.html">address()</a></code>メンバ関数を追加</li> <li><code><a href="../reference/atomic/atomic.html">std::atomic</a></code>クラスのテンプレートパラメータとしてCV修飾された型を禁止</li> <li><code><a href="../reference/atomic/atomic_ref.html">std::atomic_ref</a></code>クラスのテンプレートパラメータとして、CV修飾された型を受け取れるようにした (内部でCV修飾が外される)</li> <li><code><a href="../reference/atomic.html">&lt;atomic&gt;</a></code>ライブラリのアトミック操作を<code>constexpr</code>対応</li> </ul> <h3>スマートポインタ・メモリ関連</h3> <ul> <li>動的確保したオブジェクトに値の意味論をもたせてディープコピーさせるユーティリティクラスとして、<code><a href="../reference/memory.html">&lt;memory&gt;</a></code>に<code><a href="../reference/memory/indirect.md.nolink">std::indirect</a></code>クラスと<code><a href="../reference/memory/polymorphic.md.nolink">std::polymorphic</a></code>クラスを追加</li> <li><code><a href="../reference/memory/weak_ptr.html">std::weak_ptr</a></code>を非順序連想コンテナのキーとして使用できるよう、<code><a href="../reference/memory.html">&lt;memory&gt;</a></code>に所有権ベースのハッシュ値を取得する関数オブジェクト<code><a href="../reference/memory/owner_hash.html">std::owner_hash</a></code>、および所有権ベースの等値比較を行う関数オブジェクト<code><a href="../reference/memory/owner_equal.html">std::owner_equal</a></code>を追加<ul> <li>関連して、<code><a href="../reference/memory/shared_ptr.html">std::shared_ptr</a></code>クラスと<code><a href="../reference/memory/weak_ptr.html">std::weak_ptr</a></code>クラスのメンバ関数として、<code>owner_hash()</code>と<code>owner_equal()</code>を追加</li> </ul> </li> <li><code><a href="../reference/memory/shared_ptr.html">std::shared_ptr</a></code>クラスとその関連機能を<code>constexpr</code>対応</li> </ul> <h3>日付・時間</h3> <ul> <li><code><a href="../reference/chrono.html">&lt;chrono&gt;</a></code>の以下のクラスに、ハッシュ値サポートとして<code><a href="../reference/functional/hash.html">std::hash</a></code>の特殊化を追加<ul> <li><code><a href="../reference/chrono/duration.html">std::chrono::duration</a></code></li> <li><code><a href="../reference/chrono/time_point.html">std::chrono::time_point</a></code></li> <li><code><a href="../reference/chrono/day.html">std::chrono::day</a></code></li> <li><code><a href="../reference/chrono/month.html">std::chrono::month</a></code></li> <li><code><a href="../reference/chrono/year.html">std::chrono::year</a></code></li> <li><code><a href="../reference/chrono/weekday.html">std::chrono::weekday</a></code></li> <li><code><a href="../reference/chrono/weekday_indexed.html">std::chrono::weekday_indexed</a></code></li> <li><code><a href="../reference/chrono/weekday_last.html">std::chrono::weekday_last</a></code></li> <li><code><a href="../reference/chrono/month_day.html">std::chrono::month_day</a></code></li> <li><code><a href="../reference/chrono/month_day_last.html">std::chrono::month_day_last</a></code></li> <li><code><a href="../reference/chrono/month_weekday.html">std::chrono::month_weekday</a></code></li> <li><code><a href="../reference/chrono/month_weekday_last.html">std::chrono::month_weekday_last</a></code></li> <li><code><a href="../reference/chrono/year_month.html">std::chrono::year_month</a></code></li> <li><code><a href="../reference/chrono/year_month_day.html">std::chrono::year_month_day</a></code></li> <li><code><a href="../reference/chrono/year_month_day_last.html">std::chrono::year_month_day_last</a></code></li> <li><code><a href="../reference/chrono/year_month_weekday.html">std::chrono::year_month_weekday</a></code></li> <li><code><a href="../reference/chrono/year_month_weekday_last.html">std::chrono::year_month_weekday_last</a></code></li> <li><code><a href="../reference/chrono/zoned_time.html">std::chrono::zoned_time</a></code></li> <li><code><a href="../reference/chrono/leap_second.html">std::chrono::leap_second</a></code></li> </ul> </li> </ul> <h3>数値</h3> <ul> <li><code><a href="../reference/cmath.html">&lt;cmath&gt;</a></code>に、浮動小数点数の最大値・最小値を求める以下の関数を追加<ul> <li><code><a href="../reference/cmath/fmaximum.html">std::fmaximum()</a></code> (-0.0と+0.0では+0.0を返し、NaNと数値ではNaNを返す)</li> <li><code><a href="../reference/cmath/fmaximum_num.html">std::fmaximum_num()</a></code> (-0.0と+0.0では+0.0を返し、NaNと数値では数値を返す)</li> <li><code><a href="../reference/cmath/fminimum.html">std::fminimum()</a></code> (-0.0と+0.0では-0.0を返し、NaNと数値ではNaNを返す)</li> <li><code><a href="../reference/cmath/fminimum_num.html">std::fminimum_num()</a></code> (-0.0と-0.0では+0.0を返し、NaNと数値では数値を返す)</li> </ul> </li> <li><code><a href="../reference/numeric.html">&lt;numeric&gt;</a></code>に、飽和演算 (Saturation Arithmetic) として、型の表現可能な範囲で演算を行う以下の関数を追加<ul> <li><code><a href="../reference/numeric/add_sat.html">std::add_sat()</a></code></li> <li><code><a href="../reference/numeric/sub_sat.html">std::sub_sat()</a></code></li> <li><code><a href="../reference/numeric/mul_sat.html">std::mul_sat()</a></code></li> <li><code><a href="../reference/numeric/div_sat.html">std::div_sat()</a></code></li> <li><code><a href="../reference/numeric/saturate_cast.html">std::saturate_cast()</a></code></li> </ul> </li> <li><code><a href="../reference/complex/complex.html">std::complex</a></code>を構造化束縛や、将来のパターンマッチで使用できるようタプルインタフェースの特殊化を追加</li> <li><code><a href="../reference/random.html">&lt;random&gt;</a></code>の範囲<code>[0, 1)</code>の乱数を生成する<code><a href="../reference/random/generate_canonical.html">std::generate_canonical()</a></code>を、望ましい統計的性質を保証するようアルゴリズムと制約を変更</li> <li><code><a href="../reference/random.html">&lt;random&gt;</a></code>に、乱数列を生成する<code><a href="../reference/random/generate_random.html">std::ranges::generate_random()</a></code>関数を追加</li> <li><code><a href="../reference/random.html">&lt;random&gt;</a></code>に、乱数生成器は並列シミュレーションに効果的なカウンターベースのPhilox乱数生成器として、<code><a href="../reference/random/philox_engine.html">std::philox_engine</a></code>クラス、およびその別名である<code><a href="../reference/random/philox4x32.html">std::philox4x32</a></code>と<code><a href="../reference/random/philox4x64.html">std::philox4x64</a></code>を追加</li> <li><code><a href="../reference/cmath.html">&lt;cmath&gt;</a></code>の以下の関数を、<code>constexpr</code>に対応 (特殊関数と、グローバルの丸めモードに依存する丸め関数以外の全て)<ul> <li><code><a href="../reference/cmath/cos.html">std::cos()</a></code></li> <li><code><a href="../reference/cmath/sin.html">std::sin()</a></code></li> <li><code><a href="../reference/cmath/tan.html">std::tan()</a></code></li> <li><code><a href="../reference/cmath/cosh.html">std::cosh()</a></code></li> <li><code><a href="../reference/cmath/sinh.html">std::sinh()</a></code></li> <li><code><a href="../reference/cmath/tanh.html">std::tanh()</a></code></li> <li><code><a href="../reference/cmath/acos.html">std::acos()</a></code></li> <li><code><a href="../reference/cmath/asin.html">std::asin()</a></code></li> <li><code><a href="../reference/cmath/atan.html">std::atan()</a></code></li> <li><code><a href="../reference/cmath/atan2.html">std::atan2()</a></code></li> <li><code><a href="../reference/cmath/acosh.html">std::acosh()</a></code></li> <li><code><a href="../reference/cmath/asinh.html">std::asinh()</a></code></li> <li><code><a href="../reference/cmath/atanh.html">std::atanh()</a></code></li> <li><code><a href="../reference/cmath/exp.html">std::exp()</a></code></li> <li><code><a href="../reference/cmath/exp2.html">std::exp2()</a></code></li> <li><code><a href="../reference/cmath/expm1.html">std::expm1()</a></code></li> <li><code><a href="../reference/cmath/log.html">std::log()</a></code></li> <li><code><a href="../reference/cmath/log10.html">std::log10()</a></code></li> <li><code><a href="../reference/cmath/log1p.html">std::log1p()</a></code></li> <li><code><a href="../reference/cmath/log2.html">std::log2()</a></code></li> <li><code><a href="../reference/cmath/pow.html">std::pow()</a></code></li> <li><code><a href="../reference/cmath/sqrt.html">std::sqrt()</a></code></li> <li><code><a href="../reference/cmath/cbrt.html">std::cbrt()</a></code></li> <li><code><a href="../reference/cmath/hypot.html">std::hypot()</a></code></li> <li><code><a href="../reference/cmath/erf.html">std::erf()</a></code></li> <li><code><a href="../reference/cmath/erfc.html">std::erfc()</a></code></li> <li><code><a href="../reference/cmath/lgamma.html">std::lgamma()</a></code></li> <li><code><a href="../reference/cmath/tgamma.html">std::tgamma()</a></code></li> </ul> </li> <li><code><a href="../reference/complex.html">&lt;complex&gt;</a></code>の以下の関数を、<code>constexpr</code>に対応 (すべて)<ul> <li><code><a href="../reference/complex/complex/abs.html">std::abs()</a></code></li> <li><code><a href="../reference/complex/complex/arg.html">std::arg()</a></code></li> <li><code><a href="../reference/complex/complex/proj.html">std::proj()</a></code></li> <li><code><a href="../reference/complex/complex/polar.html">std::polar()</a></code></li> <li><code><a href="../reference/complex/complex/cos.html">std::cos()</a></code></li> <li><code><a href="../reference/complex/complex/sin.html">std::sin()</a></code></li> <li><code><a href="../reference/complex/complex/tan.html">std::tan()</a></code></li> <li><code><a href="../reference/complex/complex/cosh.html">std::cosh()</a></code></li> <li><code><a href="../reference/complex/complex/sinh.html">std::sinh()</a></code></li> <li><code><a href="../reference/complex/complex/tanh.html">std::tanh()</a></code></li> <li><code><a href="../reference/complex/complex/acos.html">std::acos()</a></code></li> <li><code><a href="../reference/complex/complex/asin.html">std::asin()</a></code></li> <li><code><a href="../reference/complex/complex/atan.html">std::atan()</a></code></li> <li><code><a href="../reference/complex/complex/acosh.html">std::acosh()</a></code></li> <li><code><a href="../reference/complex/complex/asinh.html">std::asinh()</a></code></li> <li><code><a href="../reference/complex/complex/atanh.html">std::atanh()</a></code></li> <li><code><a href="../reference/complex/complex/exp.html">std::exp()</a></code></li> <li><code><a href="../reference/complex/complex/log.html">std::log()</a></code></li> <li><code><a href="../reference/complex/complex/log10.html">std::log10()</a></code></li> <li><code><a href="../reference/complex/complex/pow.html">std::pow()</a></code></li> <li><code><a href="../reference/complex/complex/sqrt.html">std::sqrt()</a></code></li> <li><code><a href="../reference/complex/complex/norm.html">std::norm()</a></code> (算術型オーバーロード)</li> <li><code><a href="../reference/complex/complex/conj.html">std::conj()</a></code> (算術型オーバーロード)</li> <li><code><a href="../reference/complex/complex/imag_free.html">std::imag()</a></code> (算術型オーバーロード)</li> <li><code><a href="../reference/complex/complex/real_free.html">std::real()</a></code> (算術型オーバーロード)</li> </ul> </li> </ul> <h3>ユーティリティ</h3> <ul> <li><code><a href="../reference/variant/variant.html">std::variant</a></code>クラスに、メンバ関数版の<code><a href="../reference/variant/variant/visit.html">visit()</a></code>を追加</li> <li><code>std::monostate</code>を<code><a href="../reference/variant.html">&lt;variant&gt;</a></code>から<code><a href="../reference/utility.html">&lt;utility&gt;</a></code>に移動</li> <li><code><a href="../reference/optional/optional.html">std::optional</a></code>クラスに、0もしくは1要素のRangeとして扱えるようにするための拡張として、イテレータインタフェースを追加<ul> <li><code>iterator</code>型</li> <li><code>const_iterator</code>型</li> <li><code><a href="../reference/optional/optional/begin.html">begin()</a></code>メンバ関数</li> <li><code><a href="../reference/optional/optional/end.html">end()</a></code>メンバ関数</li> </ul> </li> <li><code><a href="../reference/optional/optional.html">std::optional</a></code>に、参照を保持するための<code>T&amp;</code>の部分特殊化を追加</li> <li><code><a href="../reference/tuple/apply.html">std::apply</a></code>の戻り値型推論をやめて、戻り値型用の<code><a href="../reference/type_traits/apply_result.html">std::apply_result</a></code>クラスを追加し、関連する以下の機能を追加<ul> <li><code><a href="../reference/type_traits/is_applicable.html">std::is_applicable</a></code>型特性</li> <li><code><a href="../reference/type_traits/is_nothrow_applicable.html">std::is_nothrow_applicable</a></code>型特性</li> </ul> </li> <li><code><a href="../reference/tuple/ignore.html">std::ignore</a></code>をファーストクラス・オブジェクトとして型を詳細に定義</li> <li><code><a href="../reference/bitset/bitset.html">std::bitset</a></code>に、<code><a href="../reference/string_view/basic_string_view.html">std::basic_string_view</a></code>を受け取るコンストラクタを追加</li> <li><code><a href="../reference/ratio.html">&lt;ratio&gt;</a></code>に、新たなSI接頭辞として、以下を追加<ul> <li><code><a href="../reference/ratio/si_prefix.html">ronna</a></code> (10<sup>27</sup>)</li> <li><code><a href="../reference/ratio/si_prefix.html">ronto</a></code> (10<sup>−27</sup>)</li> <li><code><a href="../reference/ratio/si_prefix.html">quetta</a></code> (10<sup>30</sup>)</li> <li><code><a href="../reference/ratio/si_prefix.html">quecto</a></code> (10<sup>−30</sup>)</li> </ul> </li> <li>定数式での例外送出が許可されることにともない、以下を<code>constexpr</code>化<ul> <li><code><a href="../reference/exception.html">&lt;exception&gt;</a></code>ヘッダの以下の機能<ul> <li><code><a href="../reference/exception/exception.html">std::exception</a></code>クラスの全メンバ関数</li> <li><code><a href="../reference/exception/nested_exception.html">std::nested_exception</a></code>クラスの全メンバ関数</li> <li><code><a href="../reference/exception/bad_exception.html">std::bad_exception</a></code>クラスの<code>what()</code>メンバ関数</li> <li><code><a href="../reference/exception/uncaught_exceptions.html">std::uncaught_exceptions()</a></code>関数</li> <li><code><a href="../reference/exception/current_exception.html">std::current_exception()</a></code>関数</li> <li><code><a href="../reference/exception/rethrow_exception.html">std::rethrow_exception()</a></code>関数</li> <li><code><a href="../reference/exception/make_exception_ptr.html">std::make_exception_ptr()</a></code>関数</li> <li><code><a href="../reference/exception/throw_with_nested.html">std::throw_with_nested()</a></code>関数</li> <li><code><a href="../reference/exception/rethrow_if_nested.html">std::rethrow_if_nested()</a></code>関数</li> </ul> </li> <li><code><a href="../reference/new.html">&lt;new&gt;</a></code>ヘッダの以下の機能<ul> <li><code><a href="../reference/new/bad_alloc.html">std::bad_alloc</a></code>クラスの<code>what()</code>メンバ関数</li> <li><code><a href="../reference/new/bad_array_new_length.html">std::bad_array_new_length</a></code>クラスの<code>what()</code>メンバ関数</li> </ul> </li> <li><code><a href="../reference/typeinfo.html">&lt;typeinfo&gt;</a></code>ヘッダの以下の機能<ul> <li><code><a href="../reference/typeinfo/bad_cast.html">std::bad_cast</a></code>クラスの<code>what()</code>メンバ関数</li> <li><code><a href="../reference/typeinfo/bad_typeid.html">std::bad_typeid</a></code>クラスの<code>what()</code>メンバ関数</li> </ul> </li> <li><code><a href="../reference/stdexcept.html">&lt;stdexcept&gt;</a></code>ヘッダの以下の機能<ul> <li><code><a href="../reference/stdexcept.html">std::domain_error</a></code></li> <li><code><a href="../reference/stdexcept.html">std::invalid_argument</a></code></li> <li><code><a href="../reference/stdexcept.html">std::length_error</a></code></li> <li><code><a href="../reference/stdexcept.html">std::logic_error</a></code></li> <li><code><a href="../reference/stdexcept.html">std::out_of_range</a></code></li> <li><code><a href="../reference/stdexcept.html">std::runtime_error</a></code></li> <li><code><a href="../reference/stdexcept.html">std::range_error</a></code></li> <li><code><a href="../reference/stdexcept.html">std::overflow_error</a></code></li> <li><code><a href="../reference/stdexcept.html">std::underflow_error</a></code></li> </ul> </li> <li><code><a href="../reference/expected.html">&lt;expected&gt;</a></code>ヘッダの以下の機能<ul> <li><code><a href="../reference/expected/bad_expected_access.html">std::bad_expected_access</a></code></li> </ul> </li> <li><code><a href="../reference/optional.html">&lt;optional&gt;</a></code>ヘッダの以下の機能<ul> <li><code><a href="../reference/optional/bad_optional_access.html">std::bad_optional_access</a></code></li> </ul> </li> <li><code><a href="../reference/variant.html">&lt;variant&gt;</a></code>ヘッダの以下の機能<ul> <li><code><a href="../reference/variant/bad_variant_access.html">std::bad_variant_access</a></code></li> </ul> </li> <li><code><a href="../reference/format.html">&lt;format&gt;</a></code>ヘッダの以下の機能<ul> <li><code><a href="../reference/format/format_error.html">std::format_error</a></code></li> </ul> </li> </ul> </li> <li><code><a href="../reference/memory.html">&lt;memory&gt;</a></code>に、ポインタのアライメントを判定する<code><a href="../reference/memory/is_sufficiently_aligned.html">std::is_sufficiently_aligned()</a></code>関数を追加。</li> <li><code><a href="../reference/utility.html">&lt;utility&gt;</a></code>に、タイムトラベル最適化を抑止するための観測可能ポイントとして<code><a href="../reference/utility/observable_checkpoint.md.nolink">std::observable_checkpoint()</a></code>を追加</li> <li><code><a href="../reference/exception/exception_ptr.html">std::exception_ptr</a></code>を指定した例外型にキャストする<code><a href="../reference/exception/exception_ptr_cast.html">std::exception_ptr_cast()</a></code>関数を追加</li> <li><code><a href="../reference/compare.html">&lt;compare&gt;</a></code>に、型の順序を取得する<code><a href="../reference/compare/type_order.md.nolink">std::type_order</a></code>クラスを追加</li> </ul> <h3>デバッグ</h3> <ul> <li><code><a href="../reference/cassert/assert.html">assert</a></code>マクロの引数としてカンマを含む式を指定できるよう、可変引数化</li> </ul> <h3>型特性</h3> <ul> <li><code><a href="../reference/type_traits.html">&lt;type_traits&gt;</a></code>に、共用体の指定されたメンバがアクティブかを定数式で判定するための関数として<code><a href="../reference/type_traits/is_within_lifetime.html">std::is_within_lifetime()</a></code>を追加</li> <li><code><a href="../reference/type_traits.html">&lt;type_traits&gt;</a></code>に、仮想継承の関係を判定する<code><a href="../reference/type_traits/is_virtual_base_of.html">std::is_virtual_base_of</a></code>を追加</li> <li><code><a href="../reference/type_traits.html">&lt;type_traits&gt;</a></code>に、<code><a href="../reference/type_traits/integral_constant.html">std::integral_constant</a></code>クラスを置き換える定数ラッパーとして<code><a href="../reference/type_traits/constant_wrapper.md.nolink">std::constant_wrapper</a></code>クラスを追加</li> <li><code><a href="../reference/utility/index_sequence.html">std::index_sequence</a></code>クラスを<a href="cpp17/structured_bindings.html">構造化束縛</a>と<a href="cpp26/expansion_statements.md.nolink">template for文</a>で使用できるようにするため、タプルインタフェースの特殊化を追加</li> </ul> <h3>制約</h3> <ul> <li>間接実行に関連する制約から、共通参照の要件を削除<ul> <li><code><a href="../reference/iterator/indirectly_unary_invocable.html">std::indirectly_unary_invocable</a></code></li> <li><code><a href="../reference/iterator/indirectly_unary_invocable.html">std::indirectly_regular_unary_invocable</a></code></li> <li><code><a href="../reference/iterator/indirect_unary_predicate.html">std::indirect_unary_predicate</a></code></li> <li><code><a href="../reference/iterator/indirect_binary_predicate.html">std::indirect_binary_predicate</a></code></li> <li><code><a href="../reference/iterator/indirect_equivalence_relation.html">std::indirect_equivalence_relation</a></code></li> <li><code><a href="../reference/iterator/indirect_strict_weak_order.html">std::indirect_strict_weak_order</a></code></li> </ul> </li> </ul> <h3>機能の非推奨化</h3> <ul> <li><code><a href="../reference/type_traits.html">&lt;type_traits&gt;</a></code>の<code><a href="../reference/type_traits/is_trivial.html">std::is_trivial</a></code>を非推奨化<ul> <li>これは<code><a href="../reference/type_traits/is_trivially_copyable.html">std::is_trivially_copyable</a></code>と<code><a href="../reference/type_traits/is_trivially_default_constructible.html">std::is_trivially_default_constructible</a></code>の2つが合わさったものであるが、それらは異なる状況で必要になるものであった</li> </ul> </li> <li><code><a href="../reference/atomic/memory_order.html">std::memory_order::consume</a></code>と、それに関連して<code><a href="../reference/atomic/kill_dependency.html">std::kill_dependency()</a></code>を非推奨化し、<code><a href="cpp11/attributes.html">[[carries_dependency]]</a></code>属性を削除</li> <li><code><a href="../reference/filesystem/path.html">std::filesystem::path</a></code>クラスの以下のメンバ関数を非推奨化<ul> <li><code><a href="../reference/filesystem/path/string.html">string()</a></code></li> <li><code><a href="../reference/filesystem/path/generic_string.html">generic_string()</a></code></li> </ul> </li> </ul> <h3>非推奨の取り消し</h3> <ul> <li><code><a href="../reference/memory_resource/polymorphic_allocator.html">std::polymorphic_allocator</a>::<a href="../reference/memory_resource/polymorphic_allocator/destroy.html">destroy()</a></code>の非推奨を取り消し</li> </ul> <h3>機能の削除</h3> <ul> <li>C++98から非推奨となっていた<code>&lt;strstream&gt;</code>ライブラリを削除</li> <li>C++17から非推奨となっていたUnicode変換ライブラリ<code><a href="../reference/codecvt.html">&lt;codecvt&gt;</a></code>と、<code><a href="../reference/locale/wstring_convert.html">std::wstring_convert</a></code>クラス、<code><a href="../reference/locale/wbuffer_convert.html">std::wbuffer_convert</a></code>クラスを削除</li> <li>C++20から非推奨となっていた、<code><a href="../reference/string/basic_string.html">std::basic_string</a>::<a href="../reference/string/basic_string/reserve.html">reserve()</a></code>のパラメータなしのオーバーロードを削除</li> <li>C++20から非推奨となっていた<code><a href="../reference/memory/shared_ptr.html">std::shared_ptr</a></code>に対する、以下の古いアトミック操作関数のオーバーロードを削除<ul> <li><code><a href="../reference/memory/shared_ptr/atomic_is_lock_free.html">std::atomic_is_lock_free</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_load.html">std::atomic_load</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_load_explicit.html">std::atomic_load_explicit</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_store.html">std::atomic_store</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_store_explicit.html">std::atomic_store_explicit</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_exchange.html">std::atomic_exchange</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_exchange_explicit.html">std::atomic_exchange_explicit</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_compare_exchange_weak.html">std::atomic_compare_exchange_weak</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_compare_exchange_strong.html">std::atomic_compare_exchange_strong</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_compare_exchange_weak_explicit.html">std::atomic_compare_exchange_weak_explicit</a></code></li> <li><code><a href="../reference/memory/shared_ptr/atomic_compare_exchange_strong_explicit.html">std::atomic_compare_exchange_strong_explicit</a></code></li> </ul> </li> <li>C++23から非推奨となっていた、<code><a href="../reference/memory/allocator.html">std::allocator</a></code>のメンバ型<code>is_always_equal</code>を削除</li> </ul> <h2>取り決め</h2> <ul> <li>C言語の参照をC17からC23に更新</li> </ul></div> Akira Takahashi [email protected] apply -- C++26対応としてapplyの戻り値型を取得するメタ関数を追加 #1522 fa239b65fd1b06b706d5a27ec711d5e0f66da5af:reference/tuple/apply.md 2026-03-12T11:15:34+09:00 <pre><code>diff --git a/reference/tuple/apply.md b/reference/tuple/apply.md index c25e600dd..1f5b3832d 100644 --- a/reference/tuple/apply.md +++ b/reference/tuple/apply.md @@ -13,10 +13,18 @@ namespace std { template&lt;class F, tuple-like Tuple&gt; constexpr decltype(auto) apply(F&amp;&amp; f, Tuple&amp;&amp; t) noexcept(see below); // (1) C++23 + + template&lt;class F, tuple-like Tuple&gt; + constexpr apply_result_t&lt;F, Tuple&gt; + apply(F&amp;&amp; f, Tuple&amp;&amp; t) + noexcept(is_nothrow_applicable_v&lt;F, Tuple&gt;); // (1) C++26 } ``` * tuple-like[link tuple-like.md] * tuple-like[link tuple-like.md] +* tuple-like[link tuple-like.md] +* apply_result_t[link /reference/type_traits/apply_result.md] +* is_nothrow_applicable_v[link /reference/type_traits/is_nothrow_applicable.md] ## 概要 タプルを展開し、関数の引数に適用してその関数を実行する。 @@ -69,7 +77,8 @@ return apply-impl(std::forward&lt;F&gt;(f), std::forward&lt;Tuple&gt;(t), ## 例外 -C++23から : `I`をパラメータパック`0, 1, ..., (`[`tuple_size_v`](tuple_size.md)`&lt;`[`remove_reference_t`](/reference/type_traits/remove_reference.md)`&lt;Tuple&gt;&gt;-1)`としたとき、例外指定の式は次と等価 : `noexcept(`[`invoke`](/reference/functional/invoke.md)`(std::forward&lt;F&gt;(f), get&lt;I&gt;(std::forward&lt;Tuple&gt;(t))...))` +- C++23から : `I`をパラメータパック`0, 1, ..., (`[`tuple_size_v`](tuple_size.md)`&lt;`[`remove_reference_t`](/reference/type_traits/remove_reference.md)`&lt;Tuple&gt;&gt;-1)`としたとき、例外指定の式は次と等価 : `noexcept(`[`invoke`](/reference/functional/invoke.md)`(std::forward&lt;F&gt;(f), get&lt;I&gt;(std::forward&lt;Tuple&gt;(t))...))` +- C++26から : 例外指定は[`is_nothrow_applicable_v`](/reference/type_traits/is_nothrow_applicable.md)`&lt;F, Tuple&gt;` ## 例 @@ -117,6 +126,9 @@ hello - [`std::tuple`](../tuple.md) - [INVOKE](/reference/concepts/Invoke.md) - [`tuple-like`](tuple-like.md) +- [`apply_result`](/reference/type_traits/apply_result.md) +- [`is_applicable`](/reference/type_traits/is_applicable.md) +- [`is_nothrow_applicable`](/reference/type_traits/is_nothrow_applicable.md) ## 参照 @@ -130,3 +142,5 @@ hello - C++20から効果説明の`decay_t`を`remove_cvref_t`へ変更。 - [P2517R1 Add a conditional `noexcept` specification to `std::apply`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2517r1.html) - C++23から条件付きで`noexcept`例外指定が行われる。 +- [P1317R2 Remove return type deduction in `std::apply`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1317r2.pdf) + - C++26から戻り値型が`decltype(auto)`から`apply_result_t&lt;F, Tuple&gt;`に変更され、SFINAEフレンドリーになった。 </code></pre> Akira Takahashi [email protected] type_traits -- C++26対応としてapplyの戻り値型を取得するメタ関数を追加 #1522 fa239b65fd1b06b706d5a27ec711d5e0f66da5af:reference/type_traits.md 2026-03-12T11:15:34+09:00 <div class="header">&lt;type_traits&gt;</div><h1 itemprop="name"><span class="token">type_traits</span><span class="cpp cpp11" title="C++11で追加">(C++11)</span></h1> <div itemprop="articleBody"><p><code>&lt;type_traits&gt;</code>ヘッダでは、型の特性を判定、操作するためのクラスを定義する。</p> <p>このライブラリに含まれるクラステンプレートは、メタ関数(meta function)と呼ばれている。</p> <p>本ヘッダはフリースタンディング環境でも提供される。</p> <h2>ヘルパークラス</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/integral_constant.html">integral_constant</a></code></td> <td>定数を表す型 (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/bool_constant.html">bool_constant</a></code></td> <td>真理値型の定数を表す型 (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/true_type.html">true_type</a></code></td> <td><code>true</code>を表す型 (type-alias)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/false_type.html">false_type</a></code></td> <td><code>false</code>を表す型 (type-alias)</td> <td>C++11</td> </tr> </tbody> </table> <h2>基本的な型</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/is_void.html">is_void</a></code></td> <td>型が<code>void</code>型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_null_pointer.html">is_null_pointer</a></code></td> <td>型が<code>nullptr_t</code>型か調べる (class template)</td> <td>C++14</td> </tr> <tr> <td><code><a href="type_traits/is_integral.html">is_integral</a></code></td> <td>型が整数型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_floating_point.html">is_floating_point</a></code></td> <td>型が浮動小数点型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_array.html">is_array</a></code></td> <td>型が配列型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_pointer.html">is_pointer</a></code></td> <td>型がポインタ型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_lvalue_reference.html">is_lvalue_reference</a></code></td> <td>型が左辺値参照型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_rvalue_reference.html">is_rvalue_reference</a></code></td> <td>型が右辺値参照型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_member_object_pointer.html">is_member_object_pointer</a></code></td> <td>型がメンバ変数へのポインタ型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_member_function_pointer.html">is_member_function_pointer</a></code></td> <td>型がメンバ関数へのポインタ型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_enum.html">is_enum</a></code></td> <td>型が列挙型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_union.html">is_union</a></code></td> <td>型が共用型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_class.html">is_class</a></code></td> <td>型がクラス型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_function.html">is_function</a></code></td> <td>型が関数型か調べる (class template)</td> <td>C++11</td> </tr> </tbody> </table> <h2>組み合わせた型</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/is_reference.html">is_reference</a></code></td> <td>型が参照型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_arithmetic.html">is_arithmetic</a></code></td> <td>型が算術型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_fundamental.html">is_fundamental</a></code></td> <td>型が単純型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_object.html">is_object</a></code></td> <td>型がオブジェクト型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_scalar.html">is_scalar</a></code></td> <td>型がスカラ型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_compound.html">is_compound</a></code></td> <td>型が複合型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_member_pointer.html">is_member_pointer</a></code></td> <td>型がメンバポインタ型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_scoped_enum.html">is_scoped_enum</a></code></td> <td>型がスコープ付きの列挙型か調べる (class template)</td> <td>C++23</td> </tr> </tbody> </table> <h2>型の特性</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/is_const.html">is_const</a></code></td> <td>型が<code>const</code>修飾型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_volatile.html">is_volatile</a></code></td> <td>型が<code>volatile</code>修飾型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivial.html">is_trivial</a></code></td> <td>型がトリビアル型か調べる (class template)</td> <td>C++11<br />C++26から非推奨</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_copyable.html">is_trivially_copyable</a></code></td> <td>型がトリビアルコピー可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_standard_layout.html">is_standard_layout</a></code></td> <td>型がスタンダードレイアウト型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_pod.html">is_pod</a></code></td> <td>型がPOD型か調べる (class template)</td> <td>C++11<br />C++20から非推奨</td> </tr> <tr> <td><code><a href="type_traits/is_literal_type.html">is_literal_type</a></code></td> <td>型がリテラル型か調べる (class template)</td> <td>C++11<br /> C++17から非推奨<br /> C++20で削除</td> </tr> <tr> <td><code><a href="type_traits/is_empty.html">is_empty</a></code></td> <td>型が空のクラスか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_polymorphic.html">is_polymorphic</a></code></td> <td>型が多相的クラスか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_abstract.html">is_abstract</a></code></td> <td>型が抽象クラスか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_final.html">is_final</a></code></td> <td>型に<code>final</code>が付いているかを調べる (class template)</td> <td>C++14</td> </tr> <tr> <td><code><a href="type_traits/is_aggregate.html">is_aggregate</a></code></td> <td>型が集成体かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/is_implicit_lifetime.html">is_implicit_lifetime</a></code></td> <td>型が暗黙的に構築されるかを調べる (class template)</td> <td>C++23</td> </tr> <tr> <td><code><a href="type_traits/is_signed.html">is_signed</a></code></td> <td>型が符号付き算術型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_unsigned.html">is_unsigned</a></code></td> <td>型が符号無し算術型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_bounded_array.html">is_bounded_array</a></code></td> <td>型が要素数の判明している配列型かを調べる (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/is_unbounded_array.html">is_unbounded_array</a></code></td> <td>型が要素数の不明な配列型かを調べる (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/is_constructible.html">is_constructible</a></code></td> <td>型のコンストラクタ呼出しが適格か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_default_constructible.html">is_default_constructible</a></code></td> <td>型がデフォルト構築可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_copy_constructible.html">is_copy_constructible</a></code></td> <td>型がコピー構築可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_move_constructible.html">is_move_constructible</a></code></td> <td>型がムーブ構築可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_assignable.html">is_assignable</a></code></td> <td>型が代入可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_copy_assignable.html">is_copy_assignable</a></code></td> <td>型がコピー代入可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_move_assignable.html">is_move_assignable</a></code></td> <td>型がムーブ代入可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_destructible.html">is_destructible</a></code></td> <td>型が破棄可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_constructible.html">is_trivially_constructible</a></code></td> <td>型がトリビアルに構築可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_default_constructible.html">is_trivially_default_constructible</a></code></td> <td>型がトリビアルにデフォルト構築可能かを調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_copy_constructible.html">is_trivially_copy_constructible</a></code></td> <td>型がトリビアルにコピー構築可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_move_constructible.html">is_trivially_move_constructible</a></code></td> <td>型がトリビアルにムーブ構築可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_assignable.html">is_trivially_assignable</a></code></td> <td>型がトリビアルに代入可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_copy_assignable.html">is_trivially_copy_assignable</a></code></td> <td>型がトリビアルにコピー代入可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_move_assignable.html">is_trivially_move_assignable</a></code></td> <td>型がトリビアルにムーブ代入可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_trivially_destructible.html">is_trivially_destructible</a></code></td> <td>型がトリビアルに破棄可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_constructible.html">is_nothrow_constructible</a></code></td> <td>型のコンストラクタ呼出しが適格であり、かつそのコンストラクタが例外を投げないか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_default_constructible.html">is_nothrow_default_constructible</a></code></td> <td>型がデフォルト構築でき、かつそのデフォルトコンストラクタが例外を投げないか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_copy_constructible.html">is_nothrow_copy_constructible</a></code></td> <td>型がコピー構築でき、かつそのコピーコンストラクタが例外を投げないか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_move_constructible.html">is_nothrow_move_constructible</a></code></td> <td>型がムーブ構築でき、かつそのムーブコンストラクタが例外を投げないか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_assignable.html">is_nothrow_assignable</a></code></td> <td>型の代入演算子呼び出しが適格であり、かつその代入演算子が例外を投げないか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_copy_assignable.html">is_nothrow_copy_assignable</a></code></td> <td>型がコピー代入でき、かつそのコピー代入演算子が例外を投げないか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_move_assignable.html">is_nothrow_move_assignable</a></code></td> <td>型がムーブ代入でき、かつそのムーブ代入演算子が例外を投げないか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_destructible.html">is_nothrow_destructible</a></code></td> <td>型が破棄でき、かつそのデストラクタが例外を投げないか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/has_virtual_destructor.html">has_virtual_destructor</a></code></td> <td>型が仮想デストラクタを持っているか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_swappable_with.html">is_swappable_with</a></code></td> <td>ある型とほかの型の値とがswap関数で入れ替え可能かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/is_swappable.html">is_swappable</a></code></td> <td>ある型の値がswap関数で入れ替え可能かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_swappable_with.html">is_nothrow_swappable_with</a></code></td> <td>ある型とほかの型の値とが例外を投げずにswap関数で入れ替え可能かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_swappable.html">is_nothrow_swappable</a></code></td> <td>ある型の値が例外を投げずにswap関数で入れ替え可能かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/has_unique_object_representations.html">has_unique_object_representations</a></code></td> <td>ある型のバイト表現をそのままハッシュとして利用できるかを調べる (class template)</td> <td>C++17</td> </tr> </tbody> </table> <h2>型の特性についての問い合わせ</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/alignment_of.html">alignment_of</a></code></td> <td>型のアライメントを取得する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/rank.html">rank</a></code></td> <td>配列型の次元数を取得する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/extent.html">extent</a></code></td> <td>配列型の<code>i</code>番目の次元の要素数を取得する (class template)</td> <td>C++11</td> </tr> </tbody> </table> <h2>型の関係</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/is_same.html">is_same</a></code></td> <td>二つの型が同じ型か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_base_of.html">is_base_of</a></code></td> <td>ある型が別の型の基底クラスか調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_virtual_base_of.html">is_virtual_base_of</a></code></td> <td>ある型が別の型の仮想基底クラスか調べる (class template)</td> <td>C++26</td> </tr> <tr> <td><code><a href="type_traits/is_convertible.html">is_convertible</a></code></td> <td>ある型から別の型へ変換可能か調べる (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_convertible.html">is_nothrow_convertible</a></code></td> <td>ある型から別の型へ、例外を投げずに変換可能か調べる (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/is_layout_compatible.html">is_layout_compatible</a></code></td> <td>2つの型にレイアウト互換があるかを判定する (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/is_pointer_interconvertible_base_of.html">is_pointer_interconvertible_base_of</a></code></td> <td>基底クラスと派生クラスの間でポインタ相互交換可能かを判定する (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/reference_constructs_from_temporary.html">reference_constructs_from_temporary</a></code></td> <td>参照が一時オブジェクトを直接初期化(丸カッコによる初期化)で束縛した時、一時オブジェクトの寿命が延長されているかを判定する (class template)</td> <td>C++23</td> </tr> <tr> <td><code><a href="type_traits/reference_converts_from_temporary.html">reference_converts_from_temporary</a></code></td> <td>参照が一時オブジェクトをコピー初期化(代入形式による初期化)で束縛した時、一時オブジェクトの寿命が延長されているかを判定する (class template)</td> <td>C++23</td> </tr> </tbody> </table> <h2>const-volatile の変更</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/remove_const.html">remove_const</a></code></td> <td>型の<code>const</code>修飾を除去する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/remove_volatile.html">remove_volatile</a></code></td> <td>型の<code>volatile</code>修飾を除去する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/remove_cv.html">remove_cv</a></code></td> <td>型の<code>const-volatile</code>修飾を除去する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/add_const.html">add_const</a></code></td> <td>型を<code>const</code>修飾する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/add_volatile.html">add_volatile</a></code></td> <td>型を<code>volatile</code>修飾する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/add_cv.html">add_cv</a></code></td> <td>型を<code>const-volatile</code>修飾する (class template)</td> <td>C++11</td> </tr> </tbody> </table> <h2>参照の変更</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/remove_reference.html">remove_reference</a></code></td> <td>型から参照を除去する(class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/add_lvalue_reference.html">add_lvalue_reference</a></code></td> <td>型に左辺値参照を追加する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/add_rvalue_reference.html">add_rvalue_reference</a></code></td> <td>型に右辺値参照を追加する (class template)</td> <td>C++11</td> </tr> </tbody> </table> <h2>符号の変更</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/make_signed.html">make_signed</a></code></td> <td>整数型を符号付きにする (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/make_unsigned.html">make_unsigned</a></code></td> <td>整数型を符号なしにする (class template)</td> <td>C++11</td> </tr> </tbody> </table> <h2>配列の変更</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/remove_extent.html">remove_extent</a></code></td> <td>配列型から次元を除去する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/remove_all_extents.html">remove_all_extents</a></code></td> <td>配列型から全ての次元を除去する (class template)</td> <td>C++11</td> </tr> </tbody> </table> <h2>ポインタの変更</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/add_pointer.html">add_pointer</a></code></td> <td>型にポインタを追加する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/remove_pointer.html">remove_pointer</a></code></td> <td>型からポインタを除去する (class template)</td> <td>C++11</td> </tr> </tbody> </table> <h2>関数呼び出しに関連した特性</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/is_invocable.html">is_invocable</a></code></td> <td>関数呼び出し可能かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/is_invocable_r.html">is_invocable_r</a></code></td> <td>関数呼び出し可能でその戻り値型がある型へ変換可能かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_invocable.html">is_nothrow_invocable</a></code></td> <td>例外を投げずに関数呼び出し可能かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_invocable_r.html">is_nothrow_invocable_r</a></code></td> <td>例外を投げずに関数呼び出し可能でその戻り値型がある型へ変換可能かを調べる (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/is_applicable.html">is_applicable</a></code></td> <td>タプルを展開して関数呼び出し可能かを調べる (class template)</td> <td>C++26</td> </tr> <tr> <td><code><a href="type_traits/is_nothrow_applicable.html">is_nothrow_applicable</a></code></td> <td>例外を投げずにタプルを展開して関数呼び出し可能かを調べる (class template)</td> <td>C++26</td> </tr> </tbody> </table> <h2>その他の変換</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/type_identity.html">type_identity</a></code></td> <td>受け取った型を返す (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/aligned_storage.html">aligned_storage</a></code></td> <td>アライメント調整された領域を作る (class template)</td> <td>C++11<br />C++23で非推奨</td> </tr> <tr> <td><code><a href="type_traits/aligned_union.html">aligned_union</a></code></td> <td>アライメント調整された共用体領域を作る (class template)</td> <td>C++11<br />C++23で非推奨</td> </tr> <tr> <td><code><a href="type_traits/remove_cvref.html">remove_cvref</a></code></td> <td>型の<code>const-volatile</code>修飾と参照を除去する (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/decay.html">decay</a></code></td> <td>配列と関数ポインタに関して、関数テンプレートと同様に推論された型を取得する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/enable_if.html">enable_if</a></code></td> <td>コンパイル時条件式が真の場合のみ有効な型 (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/conditional.html">conditional</a></code></td> <td>コンパイル時条件式 (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/common_type.html">common_type</a></code></td> <td>変換可能な共通の型を取得する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/void_t.html">void_t</a></code></td> <td>任意の型をvoidへ変換する (type-alias)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/basic_common_reference.html">basic_common_reference</a></code></td> <td><code>common_reference</code>へアダプトする (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/common_reference.html">common_reference</a></code></td> <td>共通の参照型を取得する (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/underlying_type.html">underlying_type</a></code></td> <td>列挙型の基底型を取得する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/result_of.html">result_of</a></code></td> <td>関数の戻り値の型を取得する (class template)</td> <td>C++11</td> </tr> <tr> <td><code><a href="type_traits/invoke_result.html">invoke_result</a></code></td> <td>関数の戻り値の型を取得する (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/apply_result.html">apply_result</a></code></td> <td>タプルを展開して関数を呼び出した場合の戻り値の型を取得する (class template)</td> <td>C++26</td> </tr> <tr> <td><code><a href="type_traits/unwrap_reference.html">unwrap_reference</a></code></td> <td><code><a href="functional/reference_wrapper.html">reference_wrapper&lt;T&gt;</a></code>型を<code>T&amp;</code>型に展開する (class template)</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/unwrap_ref_decay.html">unwrap_ref_decay</a></code></td> <td><code><a href="functional/reference_wrapper.html">reference_wrapper&lt;T&gt;</a></code>型を<code>T&amp;</code>型に展開し、型推論規則による型変換を行う (class template)</td> <td>C++20</td> </tr> </tbody> </table> <h2>論理演算</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/conjunction.html">conjunction</a></code></td> <td>特性の論理積を求める (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/disjunction.html">disjunction</a></code></td> <td>特性の論理和を求める (class template)</td> <td>C++17</td> </tr> <tr> <td><code><a href="type_traits/negation.html">negation</a></code></td> <td>特性の論理否定を求める (class template)</td> <td>C++17</td> </tr> </tbody> </table> <h2>メンバの関係性</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/is_pointer_interconvertible_with_class.html">is_pointer_interconvertible_with_class</a></code></td> <td>メンバポインタとクラスの間でポインタ相互交換可能かを判定する</td> <td>C++20</td> </tr> <tr> <td><code><a href="type_traits/is_corresponding_member.html">is_corresponding_member</a></code></td> <td>2つのメンバポインタが互換な共通位置にあるかを判定する</td> <td>C++20</td> </tr> </tbody> </table> <h2>コンパイル時評価</h2> <table border="1" bordercolor="#888" style="border-collapse:collapse"> <thead> <tr> <th>名前</th> <th>説明</th> <th>対応バージョン</th> </tr> </thead> <tbody> <tr> <td><code><a href="type_traits/is_within_lifetime.html">is_within_lifetime</a></code></td> <td>共用体の指定されたメンバがアクティブかを定数式で判定する</td> <td>C++26</td> </tr> <tr> <td><code><a href="type_traits/is_constant_evaluated.html">is_constant_evaluated</a></code></td> <td>呼び出された時、その呼び出しがコンパイル時に行われているかを判定する</td> <td>C++20</td> </tr> </tbody> </table> <h2>備考</h2> <ul> <li>このヘッダで定義されるテンプレートは、<code><a href="type_traits/common_type.html">std::common_type</a></code>、<code><a href="type_traits/basic_common_reference.html">std::basic_common_reference</a></code>を除いて、ユーザーが特殊化を追加することを禁止している</li> </ul> <h2>バージョン</h2> <h3>言語</h3> <ul> <li>C++11</li> </ul> <h2>参照</h2> <ul> <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1345.html" target="_blank">N1345 A Proposal to add Type Traits to the Standard Library</a></li> <li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1424.htm" target="_blank">N1424 A Proposal to add Type Traits to the Standard Library</a></li> <li><a href="http://www.boost.org/doc/libs/release/libs/type_traits/doc/html/index.html" target="_blank">Boost Type Traits Library</a></li> <li><a href="https://boostjp.github.io/tips/type_traits.html" target="_blank">型特性 - Boost逆引きリファレンス</a></li> <li><a href="https://wg21.cmeerw.net/lwg/issue2581" target="_blank">LWG Issue 2581. Specialization of <code>&lt;type_traits&gt;</code> variable templates should be prohibited</a><ul> <li>C++14までは<code>&lt;type_traits&gt;</code>で定義されるクラステンプレートの特殊化を禁止していたが、C++17で定義される変数テンプレートも特殊化の禁止対象とされた</li> </ul> </li> <li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1413r3.pdf" target="_blank">P1413R3 Deprecate <code>std::aligned_storage</code> and <code>std::aligned_union</code></a></li> </ul></div> Akira Takahashi [email protected] apply_result -- C++26対応としてapplyの戻り値型を取得するメタ関数を追加 #1522 fa239b65fd1b06b706d5a27ec711d5e0f66da5af:reference/type_traits/apply_result.md 2026-03-12T11:15:34+09:00 <pre><code>diff --git a/reference/type_traits/apply_result.md b/reference/type_traits/apply_result.md new file mode 100644 index 000000000..5afd53aad --- /dev/null +++ b/reference/type_traits/apply_result.md @@ -0,0 +1,88 @@ +# apply_result +* type_traits[meta header] +* std[meta namespace] +* class template[meta id-type] +* cpp26[meta cpp] + +```cpp +namespace std { + template &lt;class F, class Tuple&gt; + struct apply_result; + + template &lt;class F, class Tuple&gt; + using apply_result_t = typename apply_result&lt;F, Tuple&gt;::type; +} +``` + +## 概要 +関数呼び出し可能な型`F`に対して、[`tuple-like`](/reference/tuple/tuple-like.md)な型`Tuple`の要素を展開して[`apply`](/reference/tuple/apply.md)した場合の戻り値型を取得する。 + +[`invoke_result`](invoke_result.md)の[`apply`](/reference/tuple/apply.md)版であり、タプルの要素を引数として関数を呼び出した結果の型を求める。 + + +## 要件 +型`F`および`Tuple`が、完全型であること。もしくは`const`/`volatile`修飾された(あるいはされていない)`void`か、要素数不明の配列型であること。 + + +## 効果 +`ELEMS-OF(T)`を、`make_index_sequence&lt;tuple_size_v&lt;remove_reference_t&lt;T&gt;&gt;&gt;`が示す`index_sequence`の特殊化のテンプレート引数である`size_t`のパラメータパック`N`に対する、パラメータパック`get&lt;N&gt;(declval&lt;T&gt;())`とする。 + +式[*INVOKE*](/reference/concepts/Invoke.md)`(declval&lt;F&gt;(), ELEMS-OF(Tuple)...)`が未評価オペランドとして扱われたときに適格であるならば、メンバ型`type`は`decltype(`[*INVOKE*](/reference/concepts/Invoke.md)`(declval&lt;F&gt;(), ELEMS-OF(Tuple)...))`を示す。そうでなければ、メンバ型`type`は定義されない。 + +アクセスチェックは`F`および`Tuple`と無関係なコンテキストで行われる。式の直接のコンテキストの妥当性のみが考慮される。 + + +## 備考 +このメタ関数はC++26で追加された。C++23まで[`apply`](/reference/tuple/apply.md)の戻り値型は`decltype(auto)`による型推論が使われていたが、これはSFINAEフレンドリーではなかった。`apply_result`を使うことで、[`apply`](/reference/tuple/apply.md)の呼び出し可能性をコンセプトやSFINAEで判定できるようになった。 + + +## 例 +```cpp example +#include &lt;tuple&gt; +#include &lt;type_traits&gt; +#include &lt;string&gt; + +int add(int a, int b) { return a + b; } + +int main() +{ + using args_t = std::tuple&lt;int, int&gt;; + + // apply(add, tuple&lt;int, int&gt;) の戻り値型は int + static_assert(std::is_same_v&lt; + std::apply_result_t&lt;decltype(&amp;add), args_t&gt;, + int + &gt;); + + // 呼び出し不可能な場合、apply_result にはメンバ型 type がない + // (SFINAEフレンドリー) + static_assert(!requires { + typename std::apply_result_t&lt;decltype(&amp;add), std::tuple&lt;std::string&gt;&gt;; + }); +} +``` +* std::apply_result_t[color ff0000] + +### 出力 +``` +``` + +## バージョン +### 言語 +- C++26 + +### 処理系 +- [Clang](/implementation.md#clang): 22 [mark noimpl] +- [GCC](/implementation.md#gcc): 15 [mark noimpl] +- [Visual C++](/implementation.md#visual_cpp): 2026 Update 2 [mark noimpl] + + +## 関連項目 +- [`invoke_result`](invoke_result.md) +- [`is_applicable`](is_applicable.md) +- [`is_nothrow_applicable`](is_nothrow_applicable.md) +- [`apply`](/reference/tuple/apply.md) + + +## 参照 +- [P1317R2 Remove return type deduction in `std::apply`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1317r2.pdf) </code></pre> Akira Takahashi [email protected] is_applicable -- C++26対応としてapplyの戻り値型を取得するメタ関数を追加 #1522 fa239b65fd1b06b706d5a27ec711d5e0f66da5af:reference/type_traits/is_applicable.md 2026-03-12T11:15:34+09:00 <pre><code>diff --git a/reference/type_traits/is_applicable.md b/reference/type_traits/is_applicable.md new file mode 100644 index 000000000..f512e8812 --- /dev/null +++ b/reference/type_traits/is_applicable.md @@ -0,0 +1,88 @@ +# is_applicable +* type_traits[meta header] +* std[meta namespace] +* class template[meta id-type] +* cpp26[meta cpp] + +```cpp +namespace std { + template &lt;class F, class Tuple&gt; + struct is_applicable; + + template &lt;class F, class Tuple&gt; + inline constexpr bool is_applicable_v = std::is_applicable&lt;F, Tuple&gt;::value; +} +``` + +## 概要 +関数呼び出し可能な型`F`に対して、[`tuple-like`](/reference/tuple/tuple-like.md)な型`Tuple`の要素を展開して[`apply`](/reference/tuple/apply.md)による呼び出しが可能かどうかを調べる。 + +[`is_invocable`](is_invocable.md)の[`apply`](/reference/tuple/apply.md)版である。 + + +## 要件 +型`F`および`Tuple`が、完全型であること。もしくは`const`/`volatile`修飾された(あるいはされていない)`void`か、要素数不明の配列型であること。 + + +## 効果 +`ELEMS-OF(T)`を、`make_index_sequence&lt;tuple_size_v&lt;remove_reference_t&lt;T&gt;&gt;&gt;`が示す`index_sequence`の特殊化のテンプレート引数である`size_t`のパラメータパック`N`に対する、パラメータパック`get&lt;N&gt;(declval&lt;T&gt;())`とする。 + +[`tuple-like`](/reference/tuple/tuple-like.md)`&lt;Tuple&gt;`が`true`であり、かつ式[*INVOKE*](/reference/concepts/Invoke.md)`(declval&lt;F&gt;(), ELEMS-OF(Tuple)...)`が未評価オペランドとして扱われたときに適格であるならば[`true_type`](true_type.md)から派生し、そうでなければ[`false_type`](false_type.md)から派生する。 + + +## 例 +```cpp example +#include &lt;tuple&gt; +#include &lt;type_traits&gt; +#include &lt;string&gt; +#include &lt;iostream&gt; + +int add(int a, int b) { return a + b; } +void no_args() {} + +int main() +{ + std::cout &lt;&lt; std::boolalpha; + + // add(int, int) に tuple&lt;int, int&gt; を展開して呼び出し可能 + std::cout &lt;&lt; std::is_applicable_v&lt;decltype(&amp;add), std::tuple&lt;int, int&gt;&gt; &lt;&lt; std::endl; + + // add(int, int) に tuple&lt;int&gt; では引数が足りない + std::cout &lt;&lt; std::is_applicable_v&lt;decltype(&amp;add), std::tuple&lt;int&gt;&gt; &lt;&lt; std::endl; + + // no_args() に空のタプルで呼び出し可能 + std::cout &lt;&lt; std::is_applicable_v&lt;decltype(&amp;no_args), std::tuple&lt;&gt;&gt; &lt;&lt; std::endl; + + // no_args() に tuple&lt;int&gt; は引数が多すぎる + std::cout &lt;&lt; std::is_applicable_v&lt;decltype(&amp;no_args), std::tuple&lt;int&gt;&gt; &lt;&lt; std::endl; +} +``` +* std::is_applicable_v[color ff0000] + +### 出力 +``` +true +false +true +false +``` + +## バージョン +### 言語 +- C++26 + +### 処理系 +- [Clang](/implementation.md#clang): 22 [mark noimpl] +- [GCC](/implementation.md#gcc): 15 [mark noimpl] +- [Visual C++](/implementation.md#visual_cpp): 2026 Update 2 [mark noimpl] + + +## 関連項目 +- [`is_invocable`](is_invocable.md) +- [`is_nothrow_applicable`](is_nothrow_applicable.md) +- [`apply_result`](apply_result.md) +- [`apply`](/reference/tuple/apply.md) + + +## 参照 +- [P1317R2 Remove return type deduction in `std::apply`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1317r2.pdf) </code></pre> Akira Takahashi [email protected] is_nothrow_applicable -- C++26対応としてapplyの戻り値型を取得するメタ関数を追加 #1522 fa239b65fd1b06b706d5a27ec711d5e0f66da5af:reference/type_traits/is_nothrow_applicable.md 2026-03-12T11:15:34+09:00 <pre><code>diff --git a/reference/type_traits/is_nothrow_applicable.md b/reference/type_traits/is_nothrow_applicable.md new file mode 100644 index 000000000..132377697 --- /dev/null +++ b/reference/type_traits/is_nothrow_applicable.md @@ -0,0 +1,84 @@ +# is_nothrow_applicable +* type_traits[meta header] +* std[meta namespace] +* class template[meta id-type] +* cpp26[meta cpp] + +```cpp +namespace std { + template &lt;class F, class Tuple&gt; + struct is_nothrow_applicable; + + template &lt;class F, class Tuple&gt; + inline constexpr bool is_nothrow_applicable_v + = std::is_nothrow_applicable&lt;F, Tuple&gt;::value; +} +``` + +## 概要 +関数呼び出し可能な型`F`に対して、[`tuple-like`](/reference/tuple/tuple-like.md)な型`Tuple`の要素を展開して[`apply`](/reference/tuple/apply.md)による呼び出しが可能であり、かつその呼び出しに際して例外を投げないかどうかを調べる。 + +[`is_nothrow_invocable`](is_nothrow_invocable.md)の[`apply`](/reference/tuple/apply.md)版である。 + + +## 要件 +型`F`および`Tuple`が、完全型であること。もしくは`const`/`volatile`修飾された(あるいはされていない)`void`か、要素数不明の配列型であること。 + + +## 効果 +`ELEMS-OF(T)`を、`make_index_sequence&lt;tuple_size_v&lt;remove_reference_t&lt;T&gt;&gt;&gt;`が示す`index_sequence`の特殊化のテンプレート引数である`size_t`のパラメータパック`N`に対する、パラメータパック`get&lt;N&gt;(declval&lt;T&gt;())`とする。 + +[`is_applicable_v`](is_applicable.md)`&lt;F, Tuple&gt;`が`true`であり、かつ式[*INVOKE*](/reference/concepts/Invoke.md)`(declval&lt;F&gt;(), ELEMS-OF(Tuple)...)`がいかなる例外も投げない場合[`true_type`](true_type.md)から派生し、そうでなければ[`false_type`](false_type.md)から派生する。 + + +## 例 +```cpp example +#include &lt;tuple&gt; +#include &lt;type_traits&gt; +#include &lt;iostream&gt; + +int add(int a, int b) noexcept { return a + b; } +int may_throw(int a, int b) { return a + b; } + +int main() +{ + std::cout &lt;&lt; std::boolalpha; + + // add(int, int) noexcept + std::cout &lt;&lt; std::is_nothrow_applicable_v&lt;decltype(&amp;add), std::tuple&lt;int, int&gt;&gt; &lt;&lt; std::endl; + + // may_throw(int, int) は noexcept ではない + std::cout &lt;&lt; std::is_nothrow_applicable_v&lt;decltype(&amp;may_throw), std::tuple&lt;int, int&gt;&gt; &lt;&lt; std::endl; + + // 呼び出し不可能 + std::cout &lt;&lt; std::is_nothrow_applicable_v&lt;decltype(&amp;add), std::tuple&lt;int&gt;&gt; &lt;&lt; std::endl; +} +``` +* std::is_nothrow_applicable_v[color ff0000] + +### 出力 +``` +true +false +false +``` + +## バージョン +### 言語 +- C++26 + +### 処理系 +- [Clang](/implementation.md#clang): 22 [mark noimpl] +- [GCC](/implementation.md#gcc): 15 [mark noimpl] +- [Visual C++](/implementation.md#visual_cpp): 2026 Update 2 [mark noimpl] + + +## 関連項目 +- [`is_nothrow_invocable`](is_nothrow_invocable.md) +- [`is_applicable`](is_applicable.md) +- [`apply_result`](apply_result.md) +- [`apply`](/reference/tuple/apply.md) + + +## 参照 +- [P1317R2 Remove return type deduction in `std::apply`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1317r2.pdf) </code></pre> Akira Takahashi [email protected] operator+ -- meta headerの指定ミスを修正 038e14b4a3ce783bcbec09b1797480acd71de759:reference/string_view/basic_string_view/op_plus.md 2026-03-11T13:51:33+09:00 <pre><code>diff --git a/reference/string_view/basic_string_view/op_plus.md b/reference/string_view/basic_string_view/op_plus.md index 02ea6db4e..c45086f04 100644 --- a/reference/string_view/basic_string_view/op_plus.md +++ b/reference/string_view/basic_string_view/op_plus.md @@ -1,5 +1,5 @@ # operator+ -* string[meta header] +* string_view[meta header] * std[meta namespace] * function template[meta id-type] * cpp26[meta cpp] </code></pre> Akira Takahashi [email protected] operator+ -- C++26対応としてstringとstring_viewを連結する演算子オーバーロードを追加 #1338 9f82d6e43adb2d4da5956d9b6bcbcec9de2aa7de:reference/string/basic_string/op_plus.md 2026-03-11T13:40:57+09:00 <pre><code>diff --git a/reference/string/basic_string/op_plus.md b/reference/string/basic_string/op_plus.md index 6b181c21b..f1bc288ea 100644 --- a/reference/string/basic_string/op_plus.md +++ b/reference/string/basic_string/op_plus.md @@ -113,12 +113,40 @@ namespace std { constexpr basic_string&lt;charT, traits, Allocator&gt; operator+(basic_string&lt;charT, traits, Allocator&gt;&amp;&amp; lhs, charT rhs); // (12) C++20 + + template &lt;class charT, class traits, class Allocator&gt; + constexpr basic_string&lt;charT, traits, Allocator&gt; + operator+(const basic_string&lt;charT, traits, Allocator&gt;&amp; lhs, + type_identity_t&lt;basic_string_view&lt;charT, traits&gt;&gt; rhs); // (13) C++26 + + template &lt;class charT, class traits, class Allocator&gt; + constexpr basic_string&lt;charT, traits, Allocator&gt; + operator+(basic_string&lt;charT, traits, Allocator&gt;&amp;&amp; lhs, + type_identity_t&lt;basic_string_view&lt;charT, traits&gt;&gt; rhs); // (14) C++26 } ``` +* type_identity_t[link /reference/type_traits/type_identity.md] +* basic_string_view[link /reference/string_view/basic_string_view.md] + ## 概要 `basic_string` オブジェクトの連結を行う。 +- (1) : `basic_string`オブジェクト同士を連結する +- (2) : 右辺値の`basic_string`オブジェクトと`basic_string`オブジェクトを連結する +- (3) : `basic_string`オブジェクトと右辺値の`basic_string`オブジェクトを連結する +- (4) : 右辺値の`basic_string`オブジェクト同士を連結する +- (5) : 文字配列と`basic_string`オブジェクトを連結する +- (6) : 文字配列と右辺値の`basic_string`オブジェクトを連結する +- (7) : 文字と`basic_string`オブジェクトを連結する +- (8) : 文字と右辺値の`basic_string`オブジェクトを連結する +- (9) : `basic_string`オブジェクトと文字配列を連結する +- (10) : 右辺値の`basic_string`オブジェクトと文字配列を連結する +- (11) : `basic_string`オブジェクトと文字を連結する +- (12) : 右辺値の`basic_string`オブジェクトと文字を連結する +- (13) : `basic_string`オブジェクトと[`basic_string_view`](/reference/string_view/basic_string_view.md)オブジェクトを連結する +- (14) : 右辺値の`basic_string`オブジェクトと[`basic_string_view`](/reference/string_view/basic_string_view.md)オブジェクトを連結する + ## 戻り値 @@ -220,6 +248,21 @@ namespace std { ``` * push_back[link push_back.md] +- (13) : 以下と等価 + ```cpp + basic_string&lt;charT, traits, Allocator&gt; r = lhs; + r.append(rhs); + return r; + ``` + * append[link append.md] + +- (14) : 以下と等価 + ```cpp + lhs.append(rhs); + return std::move(lhs); + ``` + * append[link append.md] + ## 備考 (5), (6) の形式の `lhs`、および、(9), (10) の形式の `rhs` の文字列長算出のために `traits::length()` が使用される @@ -242,11 +285,14 @@ C++20からこの演算子による文字列連結時にアロケータがどの |(10) : `std::move(lhs) + &#34;rhs&#34;`|`lhs`|`lhs`|`lhs`|`lhs`|`lhs`| |(11) : `lhs + &#39;r&#39;`|新規にデフォルト構築|`lhs`からのSOCCC|`lhs`|新規にデフォルト構築|`lhs`からのSOCCC| |(12) : `std::move(lhs) + &#39;r&#39;`|`lhs`|`lhs`|`lhs`|`lhs`|`lhs`| +|(13) : `lhs + sv`| | | | |`lhs`からのSOCCC| +|(14) : `std::move(lhs) + sv`| | | | |`lhs`| 表にあるように、C++17までの仕様に完全に準拠している実装は無かった上に各実装によって伝播仕様がバラバラだったため、この変更によって影響を受けるコードはほぼ無いと思われる。 ## 例 +### 基本的な使い方 ```cpp example #include &lt;iostream&gt; #include &lt;string&gt; @@ -263,11 +309,39 @@ int main() ``` * +[color ff0000] -### 出力 +#### 出力 ``` Hello, world! ``` +### string_viewとの連結 (C++26) +```cpp example +#include &lt;iostream&gt; +#include &lt;string&gt; +#include &lt;string_view&gt; + +int main() +{ + std::string s = &#34;Hello&#34;; + std::string_view sv = &#34;, World!&#34;; + + // string + string_view (13) + std::string result1 = s + sv; + std::cout &lt;&lt; result1 &lt;&lt; &#39;\n&#39;; + + // string&amp;&amp; + string_view (14) + std::string result2 = std::string(&#34;Hello&#34;) + sv; + std::cout &lt;&lt; result2 &lt;&lt; &#39;\n&#39;; +} +``` +* +[color ff0000] + +#### 出力 +``` +Hello, World! +Hello, World! +``` + ## 関連項目 | 名前 | 説明 | @@ -276,6 +350,19 @@ Hello, world! | [`push_back`](push_back.md) | 文字を追加する | | [`insert`](insert.md) | 文字/文字列を挿入する | +## バージョン +### 言語 +- C++03 +- C++26 : (13), (14) + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [ICC](/implementation.md#icc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? + ## 参照 - [P1165R1 Make stateful allocator propagation more consistent for operator+(basic_string)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1165r1.html) - [P0980R1 Making `std::string` constexpr](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0980r1.pdf) +- [P2591R5 Concatenation of strings and string views](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2591r5.html) + - C++26で`string_view`との連結が追加された </code></pre> Akira Takahashi [email protected] basic_string_view -- C++26対応としてstringとstring_viewを連結する演算子オーバーロードを追加 #1338 9f82d6e43adb2d4da5956d9b6bcbcec9de2aa7de:reference/string_view/basic_string_view.md 2026-03-11T13:40:57+09:00 <pre><code>diff --git a/reference/string_view/basic_string_view.md b/reference/string_view/basic_string_view.md index 4774acf50..c42dd9849 100644 --- a/reference/string_view/basic_string_view.md +++ b/reference/string_view/basic_string_view.md @@ -140,6 +140,12 @@ string_view hello = sv.substr(0, 5); // 先頭5文字を抽出する ## 非メンバ関数 +### 文字列連結 + +| 名前 | 説明 | 対応バージョン | +|------|------|----------------| +| [`operator+`](basic_string_view/op_plus.md) | 文字列の連結 | C++26 | + ### 比較演算 | 名前 | 説明 | 対応バージョン | </code></pre> Akira Takahashi [email protected] operator+ -- C++26対応としてstringとstring_viewを連結する演算子オーバーロードを追加 #1338 9f82d6e43adb2d4da5956d9b6bcbcec9de2aa7de:reference/string_view/basic_string_view/op_plus.md 2026-03-11T13:40:57+09:00 <pre><code>diff --git a/reference/string_view/basic_string_view/op_plus.md b/reference/string_view/basic_string_view/op_plus.md new file mode 100644 index 000000000..02ea6db4e --- /dev/null +++ b/reference/string_view/basic_string_view/op_plus.md @@ -0,0 +1,94 @@ +# operator+ +* string[meta header] +* std[meta namespace] +* function template[meta id-type] +* cpp26[meta cpp] + +```cpp +namespace std { + template &lt;class charT, class traits, class Allocator&gt; + constexpr basic_string&lt;charT, traits, Allocator&gt; + operator+(type_identity_t&lt;basic_string_view&lt;charT, traits&gt;&gt; lhs, + const basic_string&lt;charT, traits, Allocator&gt;&amp; rhs); // (1) C++26 + + template &lt;class charT, class traits, class Allocator&gt; + constexpr basic_string&lt;charT, traits, Allocator&gt; + operator+(type_identity_t&lt;basic_string_view&lt;charT, traits&gt;&gt; lhs, + basic_string&lt;charT, traits, Allocator&gt;&amp;&amp; rhs); // (2) C++26 +} +``` +* type_identity_t[link /reference/type_traits/type_identity.md] +* basic_string[link /reference/string/basic_string.md] + +## 概要 +[`basic_string_view`](../basic_string_view.md)オブジェクトと[`basic_string`](/reference/string/basic_string.md)オブジェクトを連結する。 + +- (1) : [`basic_string_view`](../basic_string_view.md)オブジェクトと`basic_string`オブジェクトを連結する +- (2) : [`basic_string_view`](../basic_string_view.md)オブジェクトと右辺値の`basic_string`オブジェクトを連結する + +`basic_string_view`側の引数に[`type_identity_t`](/reference/type_traits/type_identity.md)を使用することで非推論コンテキストとし、`basic_string_view`に暗黙変換可能な型からの連結を可能にしている。 + + +## 戻り値 +- (1) : 以下と等価 + ```cpp + basic_string&lt;charT, traits, Allocator&gt; r = rhs; + r.insert(0, lhs); + return r; + ``` + * insert[link /reference/string/basic_string/insert.md] + +- (2) : 以下と等価 + ```cpp + rhs.insert(0, lhs); + return std::move(rhs); + ``` + * insert[link /reference/string/basic_string/insert.md] + + +## 例 +```cpp example +#include &lt;iostream&gt; +#include &lt;string&gt; +#include &lt;string_view&gt; + +int main() +{ + std::string_view sv = &#34;Hello, &#34;; + std::string s = &#34;World!&#34;; + + // string_view + string (1) + std::string result1 = sv + s; + std::cout &lt;&lt; result1 &lt;&lt; &#39;\n&#39;; + + // string_view + string&amp;&amp; (2) + std::string result2 = sv + std::string(&#34;World!&#34;); + std::cout &lt;&lt; result2 &lt;&lt; &#39;\n&#39;; +} +``` +* +[color ff0000] + +### 出力 +``` +Hello, World! +Hello, World! +``` + +## バージョン +### 言語 +- C++26 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): ?? +- [ICC](/implementation.md#icc): ?? +- [Visual C++](/implementation.md#visual_cpp): ?? + +## 関連項目 + +| 名前 | 説明 | +|-------------------------------|------------------------| +| [`basic_string::operator+`](/reference/string/basic_string/op_plus.md) | 文字列の連結 | + +## 参照 +- [P2591R5 Concatenation of strings and string views](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2591r5.html) </code></pre> Akira Takahashi [email protected]