概要
C++11とは、2011年8月に改訂され、ISO/IEC 14882:2011で標準規格化されたC++バージョンの通称である。
前バージョンであるC++03からメジャーバージョンアップされ、多くの有用な機能が追加された。
このバージョンは、策定中はC++0xと呼ばれていた。これは、2009年中までに策定を完了させることを目指して、下一桁を伏せ字にしたものである。
言語機能
一般的な機能
言語機能 | 説明 |
---|---|
変数の型推論のためのauto |
型推論 |
decltype |
式の型を取得 |
範囲for文 | 配列やコンテナといった範囲を表すオブジェクトを、簡潔に走査する |
初期化子リスト | 波カッコによる初期化をユーザー定義する。vector<int> v = {1, 2, 3}; など。 |
一様初期化 | コンストラクタの呼び出しを、波カッコで行う。T x {a, b, c}; |
右辺値参照・ムーブセマンティクス | 右辺値によるオーバーロード、およびそれによるリソースの所有権移動 |
ラムダ式 | 関数オブジェクトをその場に書く |
noexcept |
関数の例外指定、例外を投げる可能性のある式かbool 値を返す演算子 |
constexpr |
定数式 |
nullptr |
ヌルポインタを表すポインタリテラル |
インライン名前空間 | ネストした名前空間に、透過的にアクセスする |
ユーザー定義リテラル | リテラルのサフィックスをユーザー定義する |
クラス関係の機能
言語機能 | 説明 |
---|---|
関数のdefault /delete 宣言 |
自動定義される特殊関数の制御 |
委譲コンストラクタ | コンストラクタから他のコンストラクタに処理を委譲する |
非静的メンバ変数の初期化 | メンバ変数を、宣言と同時に初期値指定する |
継承コンストラクタ | 基底クラスのコンストラクタを継承する |
override とfinal |
メンバ関数のオーバーライド指定、および派生クラスでのオーバーライドの禁止を指定する |
明示的な型変換演算子のオーバーロード | 明示的な型変換が行われる場合にのみ呼び出される演算子をオーバーロードできるようにする |
friend 宣言できる対象を拡張 |
テンプレートパラメータや型の別名をfriend 宣言する |
メンバ関数の左辺値/右辺値修飾 | オブジェクトが左辺値/右辺値の場合のみ呼び出し可能であることの指定 |
クラス以外の型に関する機能
言語機能 | 説明 |
---|---|
スコープを持つ列挙型 | 強い型付けとスコープを持つ列挙型の導入と、それにともなって従来の列挙型を機能拡張 |
共用体でクラスオブジェクトをもつことを許可 | 共用体のメンバ変数として、クラスオブジェクトを持てるようにする |
テンプレート関係の機能
言語機能 | 説明 |
---|---|
テンプレートでの連続した右山カッコを許可 | vector<basic_string<char>> のように、>> をスペースを空けずに記述可能にする |
extern template |
テンプレートのインスタンス化を抑止する |
エイリアステンプレート | テンプレートによって型の別名を定義する |
可変引数テンプレート | 任意の数のテンプレートパラメータを受け取れるようにする |
ローカル型と無名型を、テンプレート引数として使用することを許可 | ローカルおよび無名として定義したクラスや列挙型を、テンプレート引数として渡せるようにする |
任意の式によるSFINAE | 特定の式が有効かどうかで、その関数をオーバーロード解決に含めるかどうかを決定する |
テンプレートのエクスポート機能を削除 | テンプレート定義をエクスポートする機能を削除する |
並行関係の機能
言語機能 | 説明 |
---|---|
スレッドローカルストレージ | スレッドごとに異なる静的記憶域に保持される変数 |
ブロックスコープを持つstatic 変数初期化のスレッドセーフ化 |
関数ローカルで定義したstatic 変数の初期化を、スレッドセーフにする |
その他様々なユーティリティ
言語機能 | 説明 |
---|---|
戻り値の型を後置する関数宣言構文 | 戻り値の型を後ろに書けるようにすることで、パラメータオブジェクトを戻り値型の文脈で使用できるようにする |
コンパイル時アサート | コンパイル時に条件式が真であることを表明する |
生文字列リテラル | 文字列リテラルにRプレフィックスを付けることで、エスケープシーケンスを無視する |
char16_t とchar32_t |
UTF-16とUTF-32の文字型 |
UTF-8文字列リテラル | char の文字列をUTF-8エンコーディングするプレフィックス |
属性構文 | [[attr]] 構文による、クラス、関数、変数の属性指定 |
alignas |
アライメントを指定する |
alignof |
アライメントを取得する |
小さな変更
ここでは、コア言語作業グループへ問題報告され、その解決策として導入された言語仕様の変更を解説する。
言語機能 | 説明 |
---|---|
更新された定義済みマクロ | 標準規格で定義されたマクロの更新 |
機能テストマクロ | C++11 の機能がサポートされているかどうかをテストするためのマクロ |
テンプレート再帰回数の制限緩和 | 17回から1024回に制限緩和 |
依存名に対するtypename とtemplate の制限緩和 |
テンプレート外でもtypename とtemplate を付けられるようになった |
入れ子名の指定にグローバルスコープ:: を付加することを許可 |
struct ::A {}; のように入れ子名を指定する際にグローバルスコープから指定できるようになった |
宣言時に要素数を指定した配列オブジェクトの、定義時の要素数を規定 | static メンバやextern として宣言した配列を定義した際、宣言時に指定した要素数として定義されることが規定された |
POSIX用の名前空間を予約 | 将来の標準化のためにPOSIX用の名前空間を予約し、ユーザーがその名前空間で機能を定義することを禁止する |
sizeof 演算子にクラスの非静的メンバを、オブジェクトを作らずに指定できるようにする |
sizeof(T::data_member) のように指定して非静的メンバのサイズを取得する |
register キーワードを非推奨化 |
コンパイラに使われなくなった最適化用の機能を非推奨化 |
参照への参照を折りたたむ | T& 型に参照を足してもT& となる |
C99互換機能
C99は、1999年に改訂され、ISO/IEC 9899:1999で標準規格化されたC言語バージョンの通称である。
C++11では、参照するC言語の規格がC89からC99に変更となり、C99の言語機能が一部、C++に導入された。
言語機能 | 説明 |
---|---|
可変引数マクロ | マクロで任意の数の引数を受け取る |
Pragma演算子 | 処理系定義の機能を使用する単項演算子 |
定義済みマクロ | C99互換で導入された定義済みマクロ |
文字列リテラルとワイド文字列リテラルの結合 | ワイド文字列定数として結合する |
long long 型 |
64ビット以上の大きさを持つ整数型 |
事前定義識別子__func__ |
現在いる関数名が格納されている識別子 |
列挙子の末尾へのカンマ付加を許可 | 末尾の列挙子の後ろにカンマを書くことが許可された |
整数に対する除算と剰余算の丸め結果を規定 | これまで実装定義だった整数の除算と剰余算に対する丸め方法を、標準で規定する |
ライブラリ更新の概要
コンテナ
- 固定長配列クラス
std::array
を追加 - 単方向リンクリストの実装である
std::forward_list
を追加 - ハッシュ表の連想コンテナである
std::unordered_map
クラス、std::unordered_set
クラス、およびその重複を許可するバージョンを追加 - コンテナ全般がムーブセマンティクスに対応
- クラステンプレートのパラメータ
T
が、コピー構築可能な型だけでなく、ムーブ構築のみ可能な型も受け付けるようになった push_back()
やinsert()
等の要素追加のためのメンバ関数が、新たな要素のコピーだけでなく、一時オブジェクトも受け取れて、ムーブで挿入ができるようになった。
- クラステンプレートのパラメータ
- 要素追加のためのメンバ関数として、クラステンプレートのパラメータ
T
のコンストラクタ引数を受け取り、一時オブジェクトの生成コストを減らせるものが追加された。これらは、以下のように命名されたメンバ関数である:emplace()
、emplace_back()
、emplace_front()
- コンテナのメモリアロケータが状態を持てるようになった
- 初期化子リストでコンテナを初期化できるようになった
- 初期化子リストをパラメータで受け取れるようにするためのクラス
std::initializer_list
を追加 - 型情報型を連想コンテナのキーとして使用するための
std::type_index
クラスを追加
イテレータ
- イテレータを進める関数
std::next()
、イテレータを逆に進める関数std::prev()
を追加 - 要素をムーブするイテレータとして、
std::move_iterator
クラスを追加 - 先頭イテレータと末尾イテレータを取得する非メンバ関数として、
std::begin()
とstd::end()
を追加
アルゴリズム
- イテレータ範囲が特定の条件を満たしているか調べる、
std::all_of()
、std::any_of()
、std::none_of
を追加 - 条件を満たしていない最初の要素を検索する
std::find_if_not()
を追加 - 指定された数の要素をコピーする
std::copy_n()
を追加 - 条件を満たす要素のみをコピーする
std::copy_if()
を追加 - イテレータ範囲の要素をムーブする
std::move()
、std::move_backward()
を追加 - 新たな乱数ライブラリ
<random>
に対応したイテレータ範囲のシャッフルアルゴリズムstd::shuffle()
を追加 - イテレータ範囲がソート済みか調べる
std::is_sorted()
を追加 - 2つの値の最小値を取得する
std::min()
、最大値を取得するstd::max()
に、初期化子リストによる可変引数版を追加 - 最小値と最大値を同時に取得する関数
std::minmax()
、std::minmax_element()
を追加 - 指定された値から始まる整数列を生成する
std::iota()
を追加
メモリ管理
- メモリアロケータの実装をより容易にするために、コンテナとメモリアロケータの中間インタフェースとして
std::allocator_traits
を追加 - スマートポインタの実装として、所有権共有方式の
std::shared_ptr
クラスと、所有権専有方式のstd::unique_ptr
クラスを追加 - 従来のスマートポインタ
auto_ptr
クラスを、非推奨とする operator&()
がオーバーロードされていたとしても正しく変数のアドレスを取得する関数、std::addressof()
を追加
入出力
- 標準ライブラリ中の入力ストリーム演算子
operator<<()
と出力ストリーム演算子operator>>()
がムーブセマンティクスに対応。ストリームの一時オブジェクトを受け取れるようになった
文字列処理
- UTF-16の文字列型
std::u16string
、UTF-32の文字列型std::u32string
を追加 - UTF-8とUTF-16、UTF-8とUTF-32といった、マルチバイト文字とワイド文字列の相互変換を行うクラス
std::wstring_convert
を追加 - 数値から文字列オブジェクトに変換する関数として、
std::to_string()
とstd::to_wstring()
を追加 - 文字列オブジェクトから数値に変換する、
std::stoi()
やstd::stof()
といった関数を追加
関数オブジェクト
- 関数ポインタと関数オブジェクトを統一的に扱えるクラス
std::function
を追加 - 関数の引数を束縛して部分適用する関数
std::bind()
を追加 - メンバ関数ポインタを関数オブジェクトにアダプトする関数
std::mem_fn()
を追加 - テンプレートに、明示的に左辺値参照を渡すための渡すためのクラス
std::reference_wrapper
と、そのヘルパ関数であるstd::ref()
とstd::cref()
を追加 - ハッシュ表コンテナの追加にともない、オブジェクトのハッシュ値を計算する関数オブジェクト
std::hash
クラスを追加 - ビット演算の関数オブジェクトとして、
std::bit_and
、std::bit_or
、std::bit_xor
を追加 - 従来の関数オブジェクトアダプタ
std::unary_function
、std::binary_function
、std::mem_fun()
、std::mem_fun_ref()
等を非推奨とする - 従来の関数バインダ
std::bind1st
、std::bind2nd
等を非推奨とする
並行処理
- スレッドを管理するクラス
std::thread
を追加 - スレッド間での排他制御を行うミューテックスの実装である
std::mutex
クラス、std::recursive_mutex
クラス等を追加- ミューテックスの所有権放棄を自動的に行うためのクラス
std::lock_guard
、std::unique_lock
を追加
- ミューテックスの所有権放棄を自動的に行うためのクラス
- スレッドセーフに一度だけ処理を呼び出す関数、
std::call_once()
を追加 - 条件変数の実装である
std::condition_variable
クラス、std::condition_variable_any
クラスを追加 - Futureデザインパターンをサポートする
std::future
クラス、std::promise
クラス、およびその補助機能を追加 - アトミック操作のライブラリ
<atomic>
を追加
汎用的なユーティリティ
std::swap()
関数を、<algorithm>
から<utility>
に移動- ムーブセマンティクスのために、左辺値を右辺値に変換する関数
std::move()
を追加 - 引数転送のための関数
std::forward()
を追加 std::pair
クラスのコンストラクタが、それぞれの要素型のコンストラクタ引数を直接受け取れるようになった- タプルの実装である
std::tuple
クラスを追加 - SFINAEのために、型の値を取得する関数
std::declval()
を追加 - 時間ユーティリティライブラリ
<chrono>
を追加 - 型特性ライブラリ
<type_traits>
を追加
エラー報告
- OSのエラー値を扱うライブラリ
<system_error>
を追加
正規表現ライブラリ
- 正規表現ライブラリ
<regex>
を追加 - ECMAScript、POSIX、AWK、grepなどの構文を切り替えて使用できるのが特徴。デフォルトではECMAScript
乱数ライブラリ
- 乱数ライブラリ
<random>
を追加 - 複数定義されている乱数生成器と分布アルゴリズムを、組み合わせて使用するのが特徴
C互換ライブラリ
- ビット幅規定の整数型ライブラリである
<cstdint>
を追加