Namespaces
Variants

C++ Standard Library

From ja.cppreference.net

C++標準ライブラリは、標準C++で使用可能な幅広い機能を提供します。

目次

カテゴリ

言語サポートライブラリ は、C++言語の特定の部分で必要とされるコンポーネントを提供します。例えば、メモリ確保( new / delete )や 例外処理 などです。

conceptsライブラリ は、C++プログラムが テンプレート引数 のコンパイル時検証を実行し、型のプロパティに基づいた関数ディスパッチを実行するために使用できるライブラリコンポーネントを記述します。

(C++20以降)

診断ライブラリは、C++プログラムにおけるエラー報告のための一貫したフレームワークを提供します。これには 事前定義された例外クラス も含まれます。

メモリ管理ライブラリは、メモリ管理のためのコンポーネントを提供します。これには スマートポインタ および スコープ付きアロケータ (C++11以降) が含まれます。

メタプログラミングライブラリ は、 テンプレート 内および定数評価中に使用するための機能を記述しており、 型特性 、 整数シーケンス 、 (C++14以降) および 有理数演算 を含みます。

(C++11以降)

一般ユーティリティライブラリ は、動的記憶域管理のための 事前定義されたストレージアロケータ など、他のライブラリ要素で使用されるコンポーネントや、C++プログラムの基盤として使用されるコンポーネント( タプル や (C++11以降) 関数ラッパー )を含みます。

containers 、 iterators 、 ranges (C++20以降) および algorithms ライブラリは、C++プログラムに最も広く使用されているアルゴリズムとデータ構造のサブセットへのアクセスを提供します。

文字列ライブラリ は、以下の型で表現される均質なシーケンスとしてのテキスト操作をサポートします: char 、 char8_t (C++20以降) 、 char16_t 、 char32_t (C++11以降) 、 wchar_t 、およびその他の文字様型。

テキスト処理ライブラリは テキスト処理ライブラリ が提供する 正規表現 のマッチングと検索 (C++11以降) 、 テキストフォーマット のユーティリティ (C++20以降) 、 テキストエンコーディングの識別 (C++26以降) および ローカライゼーション機能 を提供します。

注意点: - HTMLタグと属性はそのまま保持 - C++のバージョン表記(C++11, C++20, C++26)は翻訳せず - 技術用語は適切に日本語化(regular expression → 正規表現、localization → ローカライゼーションなど) - 文法的に自然な日本語になるよう調整 - 元のフォーマット構造を完全に維持

numerics library は、数値処理のサポートを拡張する numeric algorithms および complex number コンポーネントを提供します。 valarray コンポーネントは、一度にn個の処理をサポートし、そのような処理をサポートするプラットフォームでは並列操作として実装される可能性があります。 random number component は、疑似乱数を生成するための機能を提供します。 (C++11以降)

timeライブラリ は一般的に有用な時間ユーティリティを提供します。

入出力ライブラリ は、C++プログラムの入出力の主要なメカニズムである iostreamコンポーネント を提供します。これらはライブラリの他の要素、特に文字列、ロケール、イテレータと組み合わせて使用することができます。

スレッドサポートライブラリ は、スレッドの作成と管理を行うためのコンポーネントを提供します。これには アトミック操作 、 相互排他 、およびスレッド間通信が含まれます。

(C++11以降)

execution support ライブラリは、汎用的な実行リソース上での非同期実行を管理するためのフレームワークを提供します。

(since C++26)

ライブラリの内容

C++標準ライブラリは、 entities および macros の定義を、特に指定がない限り、 C++標準ライブラリヘッダー の概要に記載されている通りに提供します。

operator new および operator delete を除くすべてのライブラリエンティティは、名前空間 std 内、または名前空間 std 内にネストされた 名前空間 内で定義されています(C標準ライブラリ機能のエンティティを除く。詳細は後述)。 特定の名前空間で宣言された名前が、その名前空間内で直接宣言されるか、その名前空間内の インライン名前空間 内で宣言されるかは未規定です。 (C++11以降)

ヘッダ

C++標準ライブラリの各要素は、適切な ヘッダー で宣言または定義されます。ヘッダーは必ずしもソースファイルではなく、ヘッダー名内の < と > で区切られたシーケンスも必ずしも有効なソースファイル名ではありません。

C++標準ライブラリは、 C++ライブラリヘッダー および Cライブラリ機能のための追加C++ヘッダー を提供します (説明については「 headers 」ページを参照):

**注記**: このHTMLフラグメントには翻訳対象となる自然言語のテキストが含まれていません。すべての要素は以下の通りです: - HTMLタグと属性(翻訳対象外) - C++ヘッダーファイル名(``, ``など - C++専門用語として翻訳対象外) - ``タグ内のコード(翻訳対象外) したがって、元のHTML構造と内容は完全に保持されています。 HTMLタグ、属性、コードタグ内のテキストは翻訳せず、元のフォーマットを保持しました。C++固有の用語も翻訳していません。 **注記**: 指定された要件に基づき: - HTMLタグと属性は翻訳せず、元のフォーマットを保持 - ``タグ内のC++ヘッダー名は翻訳対象外 - title属性内のテキストはC++関連用語のため翻訳せず保持 - 全体的な構造とコード部分は変更なし **注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。すべての表示テキストは以下の通りです: - HTMLタグと属性(翻訳対象外) - ``タグ内のC++ヘッダー名(``, ``, ``, ``, ``) - これらはC++固有の用語であり翻訳対象外 したがって、元のHTML構造とコンテンツは完全に保持されています。 **注記**: このHTMLフラグメントには翻訳すべきテキストが含まれていません。すべてのコンテンツは以下のいずれかに該当します: - HTMLタグおよび属性(翻訳対象外) - ``タグ内のC++ヘッダー名(翻訳対象外) - タイトル属性内の技術用語(翻訳対象外) したがって、元のHTML構造とコンテンツは完全に保持されています。 **注記**: このHTMLフラグメントには翻訳すべきテキストが含まれていません。すべてのコンテンツは以下のいずれかに該当します: - HTMLタグと属性(翻訳対象外) - ``タグ内のC++ヘッダー名(``, ``など - 翻訳対象外) - title属性内の技術的なパス(cpp/header/... - 翻訳対象外) C++ヘッダー名と技術用語は原文のまま保持されています。 **注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。すべての要素は以下の通りです: - HTMLタグと属性(翻訳対象外) - C++ヘッダーファイル名(``, ``, ``, ``, `` - C++専門用語として翻訳対象外) - ``タグ内のコード(翻訳対象外) したがって、元のHTML構造とコンテンツは完全に保持されています。 **注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。すべての表示テキストはHTMLタグ(``タグ内のC++ヘッダー名)であり、指示に従って翻訳対象外としています。タイトル属性のテキストもC++固有の用語を含むため、翻訳していません。 **注記**: 指定された要件に基づき、以下の通り翻訳を行いました: - HTMLタグ、属性、``タグ内のC++ヘッダー名は翻訳せず保持 - `title`属性内の説明文のみ日本語に翻訳 - C++固有の用語は翻訳せず保持 翻訳された`title`属性: - `title="cpp/header/flat map"` → `title="cpp/ヘッダー/flat map"` - `title="cpp/header/generator"` → `title="cpp/ヘッダー/generator"` - `title="cpp/header/print"` → `title="cpp/ヘッダー/print"` - `title="cpp/header/stacktrace"` → `title="cpp/ヘッダー/stacktrace"` **注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。すべての要素は以下の通りです: - HTMLタグと属性(翻訳対象外) - ``タグ内のC++ヘッダー名(``, ``, ``, `` - 翻訳対象外) - title属性内の技術的なパス(翻訳対象外) したがって、元のフォーマットは完全に保持されています。
C++ ライブラリヘッダー
<algorithm> <iomanip> <list> <ostream> <streambuf>
<bitset> <ios> <locale> <queue> <string>
<complex> <iosfwd> <map> <set> <typeinfo>
<deque> <iostream> <memory> <sstream> <utility>
<exception> <istream> <new> <stack> <valarray>
<fstream> <iterator> <numeric> <stdexcept> <vector>
<functional> <limits>
C++11で追加されたヘッダー
<array> <condition_variable> <mutex> <scoped_allocator> <type_traits>
<atomic> <forward_list> <random> <system_error> <typeindex>
<chrono> <future> <ratio> <thread> <unordered_map>
<codecvt> <initializer_list> <regex> <tuple> <unordered_set>
C++14で追加されたヘッダー
<shared_mutex>
C++17で追加されたヘッダー
<any> <execution> <memory_resource> <string_view> <variant>
<charconv> <filesystem> <optional>
C++20で追加されたヘッダー
<barrier> <concepts> <latch> <semaphore> <stop_token>
<bit> <coroutine> <numbers> <source_location> <syncstream>
<compare> <format> <ranges> <span> <version>
C++23で追加されたヘッダー
<expected> <flat_set> <mdspan> <spanstream> <stdfloat>
<flat_map> <generator> <print> <stacktrace>
C++26で追加されたヘッダー
<contracts> <hazard_pointer> <inplace_vector> <rcu> <text_encoding>
<debugging> <hive> <linalg> <simd>
削除されたヘッダー
<codecvt> (C++11以降) (C++17で非推奨) (C++26で削除)
<strstream> (C++98で非推奨) (C++26で削除)
Cライブラリ機能のためのC++ヘッダー
<cassert> <clocale> <cstdarg> <cstring>
<cctype> <cmath> <cstddef> <ctime>
<cerrno> <csetjmp> <cstdio> <cwchar>
<cfloat> <csignal> <cstdlib> <cwctype>
<climits>
C++11で追加されたヘッダー
<cfenv> <cinttypes> <cstdint> <cuchar>
削除されたヘッダー
<ccomplex> (C++11以降) (C++17で非推奨) (C++20で削除)
<ciso646> (C++20で削除)
<cstdalign> (C++11以降) (C++17で非推奨) (C++20で削除)
<cstdbool> (C++11以降) (C++17で非推奨) (C++20で削除)
<ctgmath> (C++11以降) (C++17で非推奨) (C++20で削除)

フリースタンディング実装 は実装定義のヘッダーセットを持ち、ヘッダーセットの最小要件については こちら を参照してください。

C標準ライブラリ

C++標準ライブラリは、静的型安全性を確保するために適切に調整されたC標準ライブラリの機能も利用可能にします。多くのライブラリ関数の説明は、それらの関数の意味論についてC標準ライブラリに依存しています。

一部の場合において、標準C++で指定されるシグネチャはC標準ライブラリのシグネチャと異なる場合があり、追加のオーバーロードが宣言されることもありますが、特に明記されていない限り、動作と事前条件 (C言語の restrict によって暗示されるものを含む) (C++17以降) は同じです。

C標準ライブラリとの互換性のため、C++標準ライブラリは以下のCヘッダーを提供します。これらのヘッダーの使用目的は相互運用性のみを想定しています。ISO Cとして有効であるために、C++ソースファイルがこれらのヘッダーのいずれかをインクルードする必要がある場合があります。ISO Cとしても有効であることを意図していないソースファイルは、いずれのCヘッダーも使用すべきではありません。説明については こちら を参照してください。

Cヘッダー
<assert.h> <limits.h> <stdarg.h> <string.h>
<ctype.h> <locale.h> <stddef.h> <time.h>
<errno.h> <math.h> <stdio.h> <wchar.h>
<float.h> <setjmp.h> <stdlib.h> <wctype.h>
<iso646.h> <signal.h>
C++11で追加されたヘッダー
<complex.h> <inttypes.h> <stdbool.h> <tgmath.h>
<fenv.h> <stdalign.h> <stdint.h> <uchar.h>
C++23で追加されたヘッダー
<stdatomic.h>
C++26で追加されたヘッダー
<stdbit.h> <stdchkint.h>

特に明記されていない限り、各ヘッダー c xxx の内容は、 C標準ライブラリ で規定されている対応するヘッダー xxx .h と同じです。ただし、C++標準ライブラリでは、宣言(Cでマクロとして定義されている名前を除く)は名前空間 std のスコープ内にあります。これらの名前(追加されたオーバーロードを含む)が最初にグローバル名前空間スコープで宣言され、その後明示的な using宣言 によって名前空間 std に注入されるかどうかは未規定です。

C言語でマクロとして定義されている名前( assert 、 offsetof 、 setjmp 、 va_arg 、 va_end および va_start )は、C++標準ライブラリでもマクロとして定義されなければならず、たとえC言語が関数として実装する許可を与えている場合でも同様です。

Cで関数として定義されている名前は、C++標準ライブラリでも関数として定義されなければなりません。これにより、Cで許可されている、関数プロトタイプに加えてマスクマクロを提供する慣行が禁止されます。C++で同等のインライン動作を実現する唯一の方法は、extern inline function として定義を提供することです。

C++のキーワードまたは演算子である識別子は、C++標準ライブラリヘッダーでマクロとして定義することはできません。特に、標準ヘッダー <iso646.h> を含めても効果はありません。

標準Cにおける安全な関数に関連する名前 (C++17以降)

いずれかのC++ヘッダーがインクルードされた場合、以下のC標準附属書Kの名前のいずれかがグローバル名前空間で宣言されるかどうかは実装定義です(これらのいずれも std 名前空間では宣言されません):

C標準 Annex K 名前
abort_handler_s mbstowcs_s strncat_s vswscanf_s
asctime_s memcpy_s strncpy_s vwprintf_s
bsearch_s memmove_s strtok_s vwscanf_s
constraint_handler_t memset_s swprintf_s wcrtomb_s
ctime_s printf_s swscanf_s wcscat_s
errno_t qsort_s tmpfile_s wcscpy_s
fopen_s RSIZE_MAX TMP_MAX_S wcsncat_s
fprintf_s rsize_t tmpnam_s wcsncpy_s
freopen_s scanf_s vfprintf_s wcsnlen_s
fscanf_s set_constraint_handler_s vfscanf_s wcsrtombs_s
fwprintf_s snprintf_s vfwprintf_s wcstok_s
fwscanf_s snwprintf_s vfwscanf_s wcstombs_s
gets_s sscanf_s vprintf_s wmemcpy_s
gmtime_s mbstowcs_s vscanf_s vswscanf_s
abort_handler_s strcat_s vsnprintf_s wmemmove
ignore_handler_s strcpy_s vsnwprintf_s wprintf_s
localtime_s strerrorlen_s vsprintf_s wscanf_s
L_tmpnam_s strerror_s vsscanf_s
mbsrtowcs_s strlen_s vswprintf_s

ライブラリの使用

ヘッダーのインクルード

C++標準ライブラリのエンティティはヘッダーで定義されており、その内容は翻訳単位が適切な #include プリプロセッサディレクティブを含むときに利用可能になります。

翻訳単位はライブラリヘッダを任意の順序でインクルードすることができます。各ヘッダは複数回インクルードされても、ちょうど1回インクルードされた場合と効果が異なることはありません。ただし、 <cassert> または <assert.h> をインクルードする場合の効果は、その時点での字句的に現在の NDEBUG の定義に依存します。

翻訳単位は、いかなる宣言や定義の外側で、かつその翻訳単位内でそのヘッダーで宣言されたいずれかのエンティティへの最初の参照よりも字句的に前に、ヘッダーをインクルードすることのみができる。診断は不要である。

モジュール単位 では、ヘッダーは グローバルモジュールフラグメント でのみインクルードできます。

(C++20以降)

ヘッダーのインポート

C++ライブラリヘッダー または、フリースタンディング実装の場合、実装によって提供されるそのようなヘッダーのサブセットは、まとめて インポート可能なC++ライブラリヘッダー として知られています。

インポート可能なC++ライブラリヘッダーの内容は、翻訳単位が適切な インポート宣言 を含むときに利用可能になります。

(C++20以降)

モジュールのインポート

C++標準ライブラリは以下の C++ライブラリモジュール を提供します:

  • 名前付きモジュール std は、インポート可能なC++ライブラリヘッダー(例: std::rotr from <bit> )および Cライブラリ機能のためのC++ヘッダー (例: std::puts from <cstdio> )によって提供される名前空間 std 内の宣言をエクスポートします。さらに、 <new> によって提供されるストレージ 確保 および 解放 関数(例: ::operator new )のグローバル名前空間内の宣言もエクスポートします。
  • 名前付きモジュール std. compat は、名前付きモジュール std と同じ宣言をエクスポートし、さらにCライブラリ機能のためのC++ヘッダーによって提供される名前空間 std 内の宣言に対応するグローバル名前空間内の宣言(例: ::fclose )もエクスポートします。

標準ライブラリの各宣言について、

  • それが アタッチするモジュール は未指定であり、
  • ヘッダーのインクルード、ヘッダーユニットのインポート、またはC++ライブラリモジュールのインポートのいずれによって到達可能になったかに関わらず、同じ エンティティ を表します。
(C++23以降)

リンケージ

C++標準ライブラリのエンティティは ストレージ期間#外部リンケージ を持ちます。特に指定がない限り、オブジェクトと関数はデフォルトで extern "C++" リンケージ を持ちます。

C標準ライブラリで外部リンケージを持つ名前が extern "C" リンケージを持つか extern "C++" リンケージを持つかは実装定義です。C++標準ではこの場合 extern "C++" の使用を推奨しています。

C++プログラムが必要とするライブラリ内のオブジェクトと関数は、プログラム起動前にプログラムに組み込まれます。

標準ライブラリ実装に対する要件

保証事項

C++ヘッダーは、 宣言 および 定義 を提供する必要があります。

  • そのヘッダーの概要、または
  • そのヘッダーの概要に含まれているように見える別のヘッダーの概要。

複数のヘッダーで定義されている型やマクロ(例えば NULL など)について、これらのヘッダーを任意の順序で任意の数だけインクルードしても、 一定義規則 に違反することは決してありません。

特に指定がない限り、C標準ライブラリで定義されているすべての オブジェクト形式マクロ は、整数の 定数式 に展開され、 #if プリプロセッサ指令で使用できます。

標準ライブラリの非メンバ関数シグネチャを呼び出すと、常に実際にその関数が呼び出されます。したがって、適合する標準ライブラリ実装は、有効なC++プログラムによって呼び出される可能性のある追加の非メンバ関数を定義することはできません。

非メンバ関数のシグネチャは、追加の デフォルト引数 と共に宣言されることはありません。

特に指定がない限り、標準ライブラリの関数による非演算子・非メンバ関数の呼び出しは、 名前空間 を通じて見つかった別の argument-dependent name lookup による関数を使用しません。

各 friend宣言 について、クラス(テンプレート)定義内で関数(テンプレート)が宣言された場合、その関数(テンプレート)に対する他の宣言は提供されません。

標準ライブラリ関数のシグネチャは、それらが constexpr であることが要求される場合にのみ constexpr として宣言できる(libstdc++ cmathは ここで特に規格非準拠 である)。ヘッダがconstexpr関数またはコンストラクタの非定義宣言を提供する場合、対応する定義もそのヘッダ内で提供されるべきである。

特に指定がない限り、各標準ライブラリ関数は データ競合 を防止するために以下の各要件を満たさなければならない:

  • C++標準ライブラリ関数は、関数の引数( this を含む)を介して(直接または間接的に)アクセスされる場合を除き、現在のスレッド以外のスレッドからアクセス可能なオブジェクトに(直接または間接的に)アクセスできない。
  • C++標準ライブラリ関数は、関数の非const引数( this を含む)を介して(直接または間接的に)アクセスされる場合を除き、現在のスレッド以外のスレッドからアクセス可能なオブジェクトを(直接または間接的に)変更できない。
    • 例えば、静的ストレージ期間を持つオブジェクトは、同期なしで内部目的に使用できない。なぜなら、そうすることでスレッド間で明示的にオブジェクトを共有しないプログラムでもデータ競合が発生する可能性があるためである。
  • C++標準ライブラリ関数は、その引数を介して、またはその コンテナ 引数の要素を介して間接的にアクセス可能なオブジェクトに、それらのコンテナ要素に対して仕様で要求される関数を呼び出す以外の方法でアクセスできない。
  • イテレータ に対する操作は、標準ライブラリのコンテナまたは文字列メンバ関数を呼び出すことで取得された場合、基盤となるコンテナにアクセスできるが、変更することはできない。
    • 特に、イテレータを無効化するコンテナ操作は、そのコンテナに関連付けられたイテレータに対する操作と競合する。
  • C++標準ライブラリ関数は、それらの操作の効果がユーザーに対して 可視 である場合にのみ、現在のスレッド内でのみすべての操作を実行できる。
    • 可視的な副作用のない操作は並列化できる。
(C++11以降)

C++標準ライブラリで定義される各クラスについて、C++標準ライブラリで定義される他のクラスから 派生 することが要求されている場合、

  • 基底クラスは、 virtual と指定されている場合、 virtual でなければなりません。
  • 基底クラスは、 virtual と指定されていない場合、virtual にすることはできません。
  • 特に指定がない限り、異なる名前を持つ型は異なる型でなければなりません。

特に指定がない限り、C++標準ライブラリで規定されるすべての型は非 final 型です。

(C++11以降)

C++標準ライブラリで定義された関数が(特定の状況において)指定された型の 例外 をスローすると規定されている場合、スローされる例外はその型またはその型から派生した型のみであり、基底型に対する例外ハンドラがそれを捕捉できるようになっています。

C標準ライブラリの関数は、その関数が例外をスローするプログラム提供の関数を呼び出した場合にのみ例外をスローできます( qsort() および bsearch() はこの条件を満たします)。

C++標準ライブラリで定義されたデストラクタ操作は例外を送出しない。C++標準ライブラリのすべてのデストラクタは、 非送出例外仕様 を持つかのように振る舞う。

C++標準ライブラリの関数がエラーを std::error_code オブジェクトを通じて報告する場合、オペレーティングシステム由来のエラーについてはそのオブジェクトの category() メンバーは std::system_category() を返さなければならず、それ以外の場所から発生するエラーについては実装定義の std::error_category オブジェクトへの参照を返さなければならない。これらの各エラーカテゴリに対する value() の取り得る値は定義されるべきである。

C++標準ライブラリで定義される型のオブジェクトは ムーブ元 とすることができる。ムーブ操作は明示的に指定されるか、暗黙的に生成されるかのいずれかである。特に指定がない限り、そのようなムーブ元オブジェクトは有効だが未規定の状態に置かれる。

C++標準ライブラリで定義される型のオブジェクトは自身に対して ムーブ代入 されることがある。特に指定がない限り、そのような代入はオブジェクトを有効だが未規定の状態に置く。

(C++11以降)

実装の自由度

C++標準ライブラリのメンバー関数および非メンバー関数が inline として定義されるかどうかは未規定である。

virtual ではないC++標準ライブラリのメンバー関数について、異なるメンバー関数シグネチャのセットを宣言することができます。ただし、与えられた宣言セットからオーバーロードを選択するメンバー関数呼び出しは、そのオーバーロードが選択されたかのように動作する必要があります。これにより、例えば以下のことが可能になります:

  • デフォルト引数を持つパラメータの追加、
  • デフォルト引数を持つメンバー関数を、同等の動作を持つ2つ以上のメンバー関数で置き換えること、または
  • メンバー関数名に対する追加のシグネチャの追加。

特に指定がない限り、C++標準ライブラリのどの関数が再帰的に再入可能であるかは実装定義です。

C++標準ライブラリの実装は、ユーザーから見えずデータ競合から保護されているオブジェクトであれば、スレッド間で独自の内部オブジェクトを共有することができます。

(since C++11)

C++標準ライブラリの関数シグネチャまたはクラスが、C++標準ライブラリ内の他のクラスのフレンドであるかどうかは未規定です。

ここで説明されている名前およびグローバル関数シグネチャは、 ここ に記載されているものは実装に予約されています。

C++標準ライブラリの任意のクラスは、実装に予約された名前を持つクラスから派生させることができます。C++標準ライブラリで定義されたクラスが、C++標準ライブラリ内の他のクラスから派生する必要がある場合、そのクラスは必要な基底クラスから直接、または実装に予約された名前を持つ基底クラスの階層を介して間接的に派生させることができます。

C++標準ライブラリで定義された関数が例外をスローするように指定されていないが、非スロー例外仕様を持たない場合、スローされる例外は実装定義ですが、その型は std::exception または std::exception から派生した任意の型であるべきです。

非仮想関数の例外仕様は、非スロー例外仕様を追加することで強化できます。

標準ライブラリの強化

実装は hardened implementation  である可能性があり、実装がhardenedされているかどうかは実装定義です。

一部の標準ライブラリメンバー関数(およびメンバー関数テンプレート)は 強化された事前条件 を持ちます。このような関数が呼び出された場合:

  • 実装がハード化されている場合、関数のその他の観測可能な副作用が発生する前に、強化された事前条件で記述された述語を持つ1つ以上の 契約表明 がチェックセマンティクスで評価される。これらの表明のいずれかが非終了セマンティクスで評価され、かつ 契約違反ハンドラ が戻った場合、動作は未定義となる。
  • 実装がハード化されていない場合、強化された事前条件に違反したとき、動作は未定義となる。

事前条件が強化された関数

           - すべてのオーバーロードに事前条件が強化されている
           - 一部のオーバーロードに事前条件が強化されている


カテゴリ シーケンスコンテナ コンテナビュー 範囲ユーティリティ イテレータアダプタ 文字列(ビュー)クラス 一般ユーティリティ スタックトレース  スマート ポインタ   数値 配列 
クラス array vector inplace_vector deque list forward_list span mdspan view_interface  common_iterator  counted_iterator  basic_string  basic_string_view bitset     optional         expected     basic_stacktrace shared_ptr valarray
生成 コンストラクタ             span mdspan   common_iterator counted_iterator                
静的ヘルパ                                 current    
要素アクセス operator*                   operator* operator*       operator* operator*      
operator->                   operator->         operator-> operator->      
operator[] operator[] operator[] operator[] operator[]     operator[] operator[]     operator[] operator[] operator[] operator[]     operator[] operator[] operator[]
front front front front front front front front   front     front front            
back back back back back back   back   back     back back            
error                               error      
副ビュー first             first                        
last             last                        
subspan             subspan                        
変更子 operator=                   operator=                  
operator+=                     operator+=                
operator-=                     operator-=                
operator++                   operator++ operator++                
pop_front       pop_front pop_front pop_front                          
pop_back   pop_back pop_back pop_back pop_back             pop_back              
remove_prefix                         remove_prefix            
remove_suffix                         remove_suffix            
非メンバ operator==                   operator==                  
operator-                   operator-                  
iter_move                   iter_move iter_move                
iter_swap                   iter_swap iter_swap                
(C++26 以降)

注記

libstdc++ 、 libc++ 、および STL はすべて、C++20モードでの標準ライブラリモジュールの使用をサポートしています。

機能テスト マクロ 値 標準 機能
__cpp_lib_modules 202207L (C++23) 標準ライブラリモジュール std および std. compat
強化実装のみ
__cpp_lib_hardened_array 202502L (C++26) 強化 std::array
__cpp_lib_hardened_basic_string 202502L (C++26) 強化 std::basic_string
__cpp_lib_hardened_basic_string_view 202502L (C++26) 強化 std::basic_string_view
__cpp_lib_hardened_bitset 202502L (C++26) 強化 std::bitset
__cpp_lib_hardened_deque 202502L (C++26) 強化 std::deque
__cpp_lib_hardened_expected 202502L (C++26) 強化 std::expected
__cpp_lib_hardened_forward_list 202502L (C++26) 強化 std::forward_list
__cpp_lib_hardened_inplace_vector 202502L (C++26) 強化 std::inplace_vector
__cpp_lib_hardened_list 202502L (C++26) 強化 std::list
__cpp_lib_hardened_mdspan 202502L (C++26) 強化 std::mdspan
__cpp_lib_hardened_optional 202502L (C++26) 強化 std::optional
__cpp_lib_hardened_span 202502L (C++26) 強化 std::span
__cpp_lib_hardened_valarray 202502L (C++26) 強化 std::valarray
__cpp_lib_hardened_vector 202502L (C++26) 強化 std::vector

例

import std;

struct Str : std::string // OK, std::string cannot be final
{
    ~Str(); // Guaranteed to be noexcept
};

int main()
{
    std::puts("Hello stdlib!");
    // ::puts("Hello stdlib!"); // Requires std.compat module or stdio.h header

    // constexpr auto& void_info = std::any().type(); // std::any::type cannot be constexpr

    std::string t;
    t = std::move(t); // OK, t is left in a valid (but unspecified) state
}

出力:

Hello stdlib!

欠陥報告

以下の動作変更欠陥レポートは、以前に公開されたC++標準に対して遡及的に適用されました。

DR 適用対象 公開時の動作 修正後の動作
LWG 1 C++98 C標準ライブラリの名前の言語リンケージが未規定 実装定義
LWG 119 C++98 仮想関数の例外指定を強化可能 非仮想関数のみ許可
LWG 147 C++98 非メンバ関数の規定がグローバル関数のみ考慮 非グローバル関数も考慮
LWG 225 C++98 標準ライブラリ関数が実引数依存探索により
他の名前空間の非メンバ関数を呼び出す可能性
特に規定されない限り禁止
LWG 336 C++98 <strstream> がC++ライブラリヘッダでない C++ライブラリヘッダである
LWG 343 C++98 ライブラリヘッダの依存関係が未規定 規定(構文概要に列挙)
LWG 456 C++98 Cライブラリ機能のC++ヘッダは名前空間 std でのみ定義を提供可能 グローバル名前空間で定義後、
名前空間 std へ注入可能
LWG 465 C++98 C++のキーワードまたは演算子である識別子が
C++標準ライブラリヘッダでマクロとして定義可能
( <ciso646> のみマクロ定義禁止)
全てのC++標準ライブラリ
ヘッダでマクロ定義禁止
LWG 1178 C++98 C++ヘッダは必要な定義を含む
C++ヘッダをインクルード必須
C++ヘッダはその構文概要に
直接または間接的に含まれる
宣言と定義を提供必須
LWG 2013 C++11 標準でconstexprが要求されない関数を
標準ライブラリが constexpr 宣言できるか未規定
禁止
LWG 2225 C++98 ヘッダが不正な位置で
インクルードされた場合に診断必須
この場合の診断は不要