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
が足されました。
size_t hash_code() const; // C++11 size_t hash_code() const noexcept; // C++14
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::async
かstd::launch::deferred
の、いずれかの実行ポリシーを指定します。
この実行ポリシーは列挙型の値なので、通常はこのどちらかしか渡されないのですが、整数値を無理やりstd::launch
型にキャストしてstd::async()
関数に指定される可能性があります。
C++14では、そのような値が渡された場合、「未定義動作になる」ということが規定されました。これまで未規定だったので、たいして変わらないです。
今日はこれまで
続きます。