C++ Standard Library
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 」ページを参照):
| 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++標準ライブラリのエンティティはヘッダーで定義されており、その内容は翻訳単位が適切な #include プリプロセッサディレクティブを含むときに利用可能になります。
翻訳単位はライブラリヘッダを任意の順序でインクルードすることができます。各ヘッダは複数回インクルードされても、ちょうど1回インクルードされた場合と効果が異なることはありません。ただし、 <cassert> または <assert.h> をインクルードする場合の効果は、その時点での字句的に現在の NDEBUG の定義に依存します。
翻訳単位は、いかなる宣言や定義の外側で、かつその翻訳単位内でそのヘッダーで宣言されたいずれかのエンティティへの最初の参照よりも字句的に前に、ヘッダーをインクルードすることのみができる。診断は不要である。
|
モジュール単位 では、ヘッダーは グローバルモジュールフラグメント でのみインクルードできます。 |
(C++20以降) |
ヘッダーのインポートC++ライブラリヘッダー または、フリースタンディング実装の場合、実装によって提供されるそのようなヘッダーのサブセットは、まとめて インポート可能なC++ライブラリヘッダー として知られています。 インポート可能なC++ライブラリヘッダーの内容は、翻訳単位が適切な インポート宣言 を含むときに利用可能になります。 |
(C++20以降) |
モジュールのインポートC++標準ライブラリは以下の 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++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されているかどうかは実装定義です。 一部の標準ライブラリメンバー関数(およびメンバー関数テンプレート)は 強化された事前条件 を持ちます。このような関数が呼び出された場合:
強化された事前条件を持つメンバー関数
|
(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 |
欠陥報告
以下の動作変更欠陥レポートは、以前に公開された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 |
ヘッダが不正な位置で
インクルードされた場合に診断必須 |
この場合の診断は不要 |