最終更新日時:
が更新

履歴 編集

C++11

概要

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 ヌルポインタを表すポインタリテラル
インライン名前空間 ネストした名前空間に、透過的にアクセスする
ユーザー定義リテラル リテラルのサフィックスをユーザー定義する

クラス関係の機能

言語機能 説明
関数のdefaultdelete宣言 自動定義される特殊関数の制御
移譲コンストラクタ コンストラクタから他のコンストラクタに処理を移譲する
非静的メンバ変数の初期化 メンバ変数を、宣言と同時に初期値指定する
継承コンストラクタ 基本クラスのコンストラクタを継承する
overridefinal メンバ関数のオーバーライド指定、および派生クラスでのオーバーライドの禁止を指定する
明示的な型変換演算子のオーバーロード 明示的な型変換が行われる場合にのみ呼び出される演算子をオーバーロードできるようにする
friend宣言できる対象を拡張 テンプレートパラメータや型の別名をfriend宣言する
メンバ関数の左辺値/右辺値修飾 オブジェクトが左辺値/右辺値の場合のみ呼び出し可能であることの指定

クラス以外の型に関する機能

言語機能 説明
スコープを持つ列挙型 強い型付けとスコープを持つ列挙型の導入と、それにともなって従来の列挙型を機能拡張
共用体の制限解除 共用体のメンバ変数として、クラスオブジェクトを持てるようにする

テンプレート関係の機能

言語機能 説明
テンプレートの右山カッコ vector<basic_string<char>>のように、>>をスペースを空けずに記述可能にする
extern template テンプレートのインスタンス化を抑止する
エイリアステンプレート テンプレートによって型の別名を定義する
可変引数テンプレート 任意の数のテンプレートパラメータを受け取れるようにする
ローカル型と無名型を、テンプレート引数として使用することを許可 ローカルおよび無名として定義したクラスや列挙型を、テンプレート引数として渡せるようにする
任意の式によるSFINAE 特定の式が有効かどうかで、その関数をオーバーロード解決に含めるかどうかを決定する
テンプレートのエクスポート機能を削除 テンプレート定義をエクスポートする機能を削除する

並行関係の機能

言語機能 説明
スレッドローカルストレージ スレッドごとに異なる静的記憶域に保持される変数
ブロックスコープを持つstatic変数初期化のスレッドセーフ化 関数ローカルで定義したstatic変数の初期化を、スレッドセーフにする

その他様々なユーティリティ

言語機能 説明
戻り値の型を後置する関数宣言構文 戻り値の型を後ろに書けるようにすることで、パラメータオブジェクトを戻り値型の文脈で使用できるようにする
コンパイル時アサート コンパイル時に条件式が真であることを表明する
生文字列リテラル 文字列リテラルにRプレフィックスを付けることで、エスケープシーケンスを無視する
char16_tchar32_t UTF-16とUTF-32の文字型
UTF-8文字列リテラル charの文字列をUTF-8エンコーディングするプレフィックス
属性構文 [[attr]]構文による、クラス、関数、変数の属性指定
alignas アライメントを指定する
alignof アライメントを取得する

小さな変更

ここでは、コア言語作業グループへ問題報告され、その解決策として導入された言語仕様の変更を解説する。

言語機能 説明
更新された定義済みマクロ 標準規格で定義されたマクロの更新
テンプレート再帰回数の制限緩和 17回から1024回に制限緩和
依存名に対するtypenametemplateの制限緩和 テンプレート外でもtypenametemplateを付けられるようになった
入れ子名の指定にグローバルスコープ::を付加することを許可 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::allocator_traitsを追加
  • スマートポインタの実装として、所有権共有方式のstd::shared_ptrクラスと、所有権専有方式のstd::unique_ptrクラスを追加
  • 従来のスマートポインタauto_ptrクラスを、非推奨とする
  • operator&()がオーバーロードされていたとしても正しく変数のアドレスを取得する関数、std::addressof()を追加

入出力

  • 標準ライブラリ中の入力ストリーム演算子operator<<()と出力ストリーム演算子operator>>()がムーブセマンティクスに対応。ストリームの一時オブジェクトを受け取れるようになった

文字列処理

関数オブジェクト

  • 関数ポインタと関数オブジェクトを統一的に扱えるクラスstd::functionを追加
  • 関数の引数を束縛して部分適用する関数std::bind()を追加
  • メンバ関数ポインタを関数オブジェクトにアダプトする関数std::mem_fn()を追加
  • テンプレートに、明示的に左辺値参照を渡すための渡すためのクラスstd::reference_wrapperと、そのヘルパ関数であるstd::ref()std::cref()を追加
  • ハッシュ表コンテナの追加にともない、オブジェクトのハッシュ値を計算する関数オブジェクトstd::hashクラスを追加
  • ビット演算の関数オブジェクトとして、std::bit_andstd::bit_orstd::bit_xorを追加
  • 従来の関数オブジェクトアダプタstd::unary_functionstd::binary_functionstd::mem_fun()std::mem_fun_ref()等を非推奨とする
  • 従来の関数バインダstd::bind1ststd::bind2nd等を非推奨とする

並行処理

汎用的なユーティリティ

  • std::swap()関数を、<algorithm>から<utility>に移動
  • ムーブセマンティクスのために、左辺値を右辺値に変換する関数std::move()を追加
  • 引数転送のための関数std::forward()を追加
  • std::pairクラスのコンストラクタが、それぞれの要素型のコンストラクタ引数を直接受け取れるようになった
  • タプルの実装であるstd::tupleクラスを追加
  • SFINAEのために、型の値を取得する関数std::declval()を追加
  • 時間ユーティリティライブラリ<chrono>を追加
  • 型特性ライブラリ<type_traits>を追加

エラー報告

正規表現ライブラリ

  • 正規表現ライブラリ<regex>を追加
  • ECMAScript、POSIX、AWK、grepなどの構文を切り替えて使用できるのが特徴。デフォルトではECMAScript

乱数ライブラリ

  • 乱数ライブラリ<random>を追加
  • 複数定義されている乱数生成器と分布アルゴリズムを、組み合わせて使用するのが特徴

C互換ライブラリ

  • ビット幅規定の整数型ライブラリである<cstdint>を追加

参照