Web 上での C++11 関連記事まとめ

これは,C++11 Advent Calendar 2011 参加記事です.現在,開催されている Advent Calendar の一覧は Advent Calendar 2011 (jp) 開催予定リスト - Life like a clown を参照下さい.

C++11 (C++0x) に関しての情報は 本の虫Faith and Brave - C++で遊ぼう でかなり詳細な記述がありますので,情報を探す場合は site:cpplover.blogspot.comsite:d.hatena.ne.jp/faith_and_brave 辺りを指定してググってみると良いかもしれません.この記事でも,該当ブログの記事をメインにリンク集を作成しています.

尚,自分の理解が追い付いてないものや見逃したもの等があるので,結構な抜けがあるかと思います.

型推論・型指定子 (auto, decltype)

auto は右辺値の型を推論してくれる機能,decltype は式の演算結果の型を取得する機能となります.

初期化構文 (initializer_list)

std::vector 等の STL コンテナの初期化が,一つずつ push_back などのようにしなくとも {} (波括弧) で一括して行えるようになる機能です.これに合わせて,全ての初期化が {} (波括弧) で統一できるようにもなるようです.尚,リスト初期化は同じ型しか渡せないという制限があるようで,任意の数の違う型の引数を指定する場合は Variadic Templates を代わりに使う事になるようです.

ラムダ式

匿名関数(無名関数)と呼ばれるもの.昔,一番最初に聞いた時は「は?何それ?」と言う感想を抱いたのですが,他プログラミング言語を見ても随分とポピュラーな機能になってきた感があります.

rvalue reference, および Move Semantics

C++03 での問題点の一つとしてよく挙げられていた「コピーされすぎ(コピーコンストラクタが実行されすぎ)」を緩和する事を目的の一つとして導入された機能です.名称等の問題もあって馴染みにくい機能ですが,第 3 者にライブラリを提供する立場にある開発者であれば,これから必須となって来る機能だろうと思います.

定数式 (constexpr)

コンパイル時に実行される関数を定義できるようになると言うもの.constexpr 指定のものであれば swtich 文の case にも使用できるようになりので,これまでマクロで行われていた部分が代替可能になる可能性があります.ただし,記述する関数本体に厳しい制限があるので,実装するのが大変になる場合があるかもしれません.

ライブラリ

C++11 で新規に導入されるライブラリ群に関するリンク.C++11 で新規に導入されたライブラリの多くは Boost C++ Libraries から採用されたものであるため,Boost C++ Libraries の該当ライブラリの説明も参考になります.また,いくつかのものは TR1 (Technical Report 1) として,コンパイラによっては既に実装されている事もあります.

文字列・数値の相互変換

boost::lexical_cast() を用いて行っていた文字列・数値の相互変換関数群.

日付・時間

C++0x から Boost へ逆輸入された珍しい例.そのため,Boost には Boost.DateTime と Boost.Chrono と言う 2 種類の日付・時間を扱うライブラリが存在しています.

参照ラッパ
メンバ関数アダプタ (mem_fn)
エラー情報のサポート (system_error)

その他

単体の章を設けるかその他のサブ項目にするかについては,完全に私の主観で行ってますので,いろいろあるかとは思いますがまぁ・・・反応を見ながら移した方がいいかなと判断した場合は変更するかもしれません.

NULL ポインタ (nullptr)

NULL が意図せず int 型に推論されないようにするための修正.

final, および override 指定
テンプレートの別名付け (Template Aliases)

template クラスの typedef.実際には typedef ではなく using と言うキーワードを使うようです.

例外を送出しないことの明示 (noexcept)

C++03 までは,デストラクタ等によく throw() と書いていた部分に相当するものです.C++11 で例外指定が deprecated になったので,その代わりと言う感じでしょうか.

コンパイル時 assert (static_assert)

assert() のコンパイル時版.BOOST_STATIC_ASSERT() と言うマクロがありましたが,これが言語機能としてサポートされたと言う感じでしょうか.

関数の戻り値の後置

decltype との併用で便利な場面が出てくると言った感じでしょうか.

コンパイラが生成する関数への default/delete 指定

コンパイラによって自動生成されるコンストラクタ,デストラクタ,代入演算子等の各種関数がある程度制御できるようになります.

明示的な型変換

キャスト演算子とも言われていますが,これに explicit キーワードを付けられるようになるようです.explicit キーワードの付いた型変換用演算子を使用する場合は,(Type)x のように変換後の型を明示的に記述する必要があります.

委譲コンストラクタ

あるコンストラクタから,同じクラスの別のコンストラクタが利用できるようになるようです.

メンバ変数の初期値の指定

C# 辺りで馴染みのあるメンバ変数の定義部分での初期化が可能になるようです.