C++14標準ライブラリの小さな変更 その1

C++日本語リファレンスとサイトcpprefjpで、C++14対応を進めているので、このブログですでに紹介した大きな機能以外の、小さな変更点を紹介していきます。

コンテナに挿入するイテレータアダプタに、addressofを使うようになった

C++11から、std::addressof()という関数が<memory>ヘッダに追加されました。

この関数は、オブジェクトのアドレスを取得するoperator&()オーバーロードされていたとしても、そのオブジェクトのアドレスを取得できるようにする関数です。Boostから導入されたもの。

標準ライブラリのテンプレート内で、オブジェクトのポインタを取得する箇所は、このaddressof()関数を使用するようになりました。

back_insert_iteratorコンストラクタは、以下のように仕様が変わっています。

explicit back_insert_iterator(Container& x);

xへのポインタをメンバ変数containerに保持する。

C++11まで : xへのポインタは、&xで取得する
C++14以降 : xへのポインタは、std::addressof(x)で取得する

細かいnoexceptの付け忘れ対応

std::type_indexクラスの以下のメンバ関数に、付け忘れていたnoexceptが足されました。

hash_code()メンバ関数

size_t hash_code() const;          // C++11
size_t hash_code() const noexcept; // C++14

name()メンバ関数

const char* name() const;          // C++11
const char* name() const noexcept; // C++14

ほかにもいろいろあるので、追々紹介していきます。

async関数に、不正なポリシーが指定された場合の挙動が追加された

namespace std {
  template <class F, class... Args>
  future<typename result_of<F(Args...)>::type>
    async(launch policy, F&& f, Args&&... args);
}

C++11から<future>ヘッダに追加された、簡単な非同期処理をするためのasync()関数には、std::launch::asyncstd::launch::deferredの、いずれかの実行ポリシーを指定します。

この実行ポリシーは列挙型の値なので、通常はこのどちらかしか渡されないのですが、整数値を無理やりstd::launch型にキャストしてstd::async()関数に指定される可能性があります。

C++14では、そのような値が渡された場合、「未定義動作になる」ということが規定されました。これまで未規定だったので、たいして変わらないです。

今日はこれまで

続きます。