目次
カテゴリ
言語サポートライブラリ
は、C++言語の特定の部分で必要とされるコンポーネントを提供します。例えば、メモリ確保(
new
/
delete
)や
例外処理
などです。
conceptsライブラリ
は、C++プログラムが
テンプレート引数
のコンパイル時検証を実行し、型のプロパティに基づいた関数ディスパッチを実行するために使用できるライブラリコンポーネントを記述します。
(C++20以降)
診断ライブラリは、C++プログラムにおけるエラー報告のための一貫したフレームワークを提供します。これには
事前定義された例外クラス
も含まれます。
メモリ管理ライブラリは、メモリ管理のためのコンポーネントを提供します。これには
スマートポインタ
および
スコープ付きアロケータ
(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++標準ライブラリは、
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>
**注記**: このHTMLフラグメントには翻訳対象となる自然言語のテキストが含まれていません。すべての要素は以下の通りです:
- HTMLタグと属性(翻訳対象外)
- C++ヘッダーファイル名(``, ``など - C++専門用語として翻訳対象外)
- ``タグ内のコード(翻訳対象外)
したがって、元のHTML構造と内容は完全に保持されています。
<exception>
<istream>
<new>
<stack>
<valarray>
<fstream>
<iterator>
<numeric>
<stdexcept>
<vector>
<functional>
<limits>
HTMLタグ、属性、コードタグ内のテキストは翻訳せず、元のフォーマットを保持しました。C++固有の用語も翻訳していません。
C++11で追加されたヘッダー
<array>
<condition_variable>
<mutex>
<scoped_allocator>
<type_traits>
<atomic>
<forward_list>
<random>
<system_error>
<typeindex>
**注記**: 指定された要件に基づき:
- HTMLタグと属性は翻訳せず、元のフォーマットを保持
- ``タグ内のC++ヘッダー名は翻訳対象外
- title属性内のテキストはC++関連用語のため翻訳せず保持
- 全体的な構造とコード部分は変更なし
<chrono>
<future>
<ratio>
<thread>
<unordered_map>
**注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。すべての表示テキストは以下の通りです:
- HTMLタグと属性(翻訳対象外)
- ``タグ内のC++ヘッダー名(``, ``, ``, ``, ``) - これらはC++固有の用語であり翻訳対象外
したがって、元のHTML構造とコンテンツは完全に保持されています。
<codecvt>
<initializer_list>
<regex>
<tuple>
<unordered_set>
C++14で追加されたヘッダー
<shared_mutex>
C++17で追加されたヘッダー
<any>
<execution>
<memory_resource>
<string_view>
<variant>
**注記**: このHTMLフラグメントには翻訳すべきテキストが含まれていません。すべてのコンテンツは以下のいずれかに該当します:
- HTMLタグおよび属性(翻訳対象外)
- ``タグ内のC++ヘッダー名(翻訳対象外)
- タイトル属性内の技術用語(翻訳対象外)
したがって、元のHTML構造とコンテンツは完全に保持されています。
<charconv>
<filesystem>
<optional>
C++20で追加されたヘッダー
<barrier>
<concepts>
<latch>
<semaphore>
<stop_token>
**注記**: このHTMLフラグメントには翻訳すべきテキストが含まれていません。すべてのコンテンツは以下のいずれかに該当します:
- HTMLタグと属性(翻訳対象外)
- ``タグ内のC++ヘッダー名(``, ``など - 翻訳対象外)
- title属性内の技術的なパス(cpp/header/... - 翻訳対象外)
C++ヘッダー名と技術用語は原文のまま保持されています。
<bit>
<coroutine>
<numbers>
<source_location>
<syncstream>
<compare>
<format>
<ranges>
<span>
<version>
**注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。すべての要素は以下の通りです:
- HTMLタグと属性(翻訳対象外)
- C++ヘッダーファイル名(``, ``, ``, ``, `` - C++専門用語として翻訳対象外)
- ``タグ内のコード(翻訳対象外)
したがって、元のHTML構造とコンテンツは完全に保持されています。
C++23で追加されたヘッダー
<expected>
<flat_set>
<mdspan>
<spanstream>
<stdfloat>
**注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。すべての表示テキストはHTMLタグ(``タグ内のC++ヘッダー名)であり、指示に従って翻訳対象外としています。タイトル属性のテキストもC++固有の用語を含むため、翻訳していません。
<flat_map>
<generator>
<print>
<stacktrace>
**注記**: 指定された要件に基づき、以下の通り翻訳を行いました:
- 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"`
C++26で追加されたヘッダー
<contracts>
<hazard_pointer>
<inplace_vector>
<rcu>
<text_encoding>
<debugging>
<hive>
<linalg>
<simd>
**注記**: このHTMLフラグメントには翻訳すべきテキストコンテンツが含まれていません。すべての要素は以下の通りです:
- HTMLタグと属性(翻訳対象外)
- ``タグ内のC++ヘッダー名(``, ``, ``, `` - 翻訳対象外)
- title属性内の技術的なパス(翻訳対象外)
したがって、元のフォーマットは完全に保持されています。
削除されたヘッダー
<codecvt>
(C++11以降)
(C++17で非推奨)
(C++26で削除)
<strstream>
(C++98で非推奨)
(C++26で削除)
フリースタンディング実装
は実装定義のヘッダーセットを持ち、ヘッダーセットの最小要件については
こちら
を参照してください。
C標準ライブラリ
C++標準ライブラリは、静的型安全性を確保するために適切に調整されたC標準ライブラリの機能も利用可能にします。多くのライブラリ関数の説明は、それらの関数の意味論についてC標準ライブラリに依存しています。
一部の場合において、標準C++で指定されるシグネチャはC標準ライブラリのシグネチャと異なる場合があり、追加のオーバーロードが宣言されることもありますが、特に明記されていない限り、動作と事前条件
(C言語の
restrict
によって暗示されるものを含む)
(C++17以降)
は同じです。
C標準ライブラリとの互換性のため、C++標準ライブラリは以下のCヘッダーを提供します。これらのヘッダーの使用目的は相互運用性のみを想定しています。ISO Cとして有効であるために、C++ソースファイルがこれらのヘッダーのいずれかをインクルードする必要がある場合があります。ISO Cとしても有効であることを意図していないソースファイルは、いずれのCヘッダーも使用すべきではありません。説明については
こちら
を参照してください。
特に明記されていない限り、各ヘッダー
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++ライブラリヘッダー
または、フリースタンディング実装の場合、実装によって提供されるそのようなヘッダーのサブセットは、まとめて
インポート可能なC++ライブラリヘッダー
として知られています。
インポート可能なC++ライブラリヘッダーの内容は、翻訳単位が適切な
インポート宣言
を含むときに利用可能になります。
(C++20以降)
モジュールのインポート
C++標準ライブラリは以下の
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++標準ライブラリ関数は、関数の引数(
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つ以上の
契約表明
がチェックセマンティクスで評価される。これらの表明のいずれかが非終了セマンティクスで評価され、かつ
契約違反ハンドラ
が戻った場合、動作は未定義となる。
実装がハード化されていない場合、強化された事前条件に違反したとき、動作は未定義となる。
事前条件が強化された関数
- すべてのオーバーロードに事前条件が強化されている
- 一部のオーバーロードに事前条件が強化されている
(C++26 以降)
注記
libstdc++
、
libc++
、および
STL
はすべて、C++20モードでの標準ライブラリモジュールの使用をサポートしています。
例
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
}
出力:
欠陥報告
以下の動作変更欠陥レポートは、以前に公開された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
ヘッダが不正な位置で
インクルードされた場合に診断必須
この場合の診断は不要