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

その1その2に引き続き、C++14の標準ライブラリに入った小さな変更を紹介していきます。

細かいnoexceptの付け忘れ対応

C++11で<memory>ヘッダに追加されたアロケータの中間インタフェースstd::allocator_traitsクラスmax_size()静的メンバ関数に、noexceptが追加されました。

static size_type max_size(Alloc& a);                // C++11
static size_type max_size(const Alloc& a) noexcept; // C++14

ついでに、constの付け忘れにも対応。

weak_ptrのlockがスレッドセーフに

weak_ptrオブジェクトが監視しているshared_ptrオブジェクトを取得するlock()メンバ関数が、アトミックに実行されることが保証されました。

shared_ptr<T> lock() const noexcept;

戻り値:
expired() ? shared_ptr<T>() : shared_ptr<T>(*this)

監視しているshared_ptrオブジェクトが有効な状態なら、そのshared_ptrオブジェクトとリソースを共有するshared_ptrオブジェクトを作って返す。これによって、ロックしている間、shared_ptrオブジェクトの寿命が尽きないようにする。

監視しているshared_ptrオブジェクトが寿命切れ状態なら、空のshared_ptrオブジェクトを作って返す。

C++14 : 上記に相当することをアトミックに実行する。

文字列から数値に変換する関数のエラーに、ERANGEを考慮する

C++11からされたbasic_stringを整数もしくは浮動小数点数に変換する関数に、ERANGEエラーが考慮されるようになりました。

変更対象となる関数は以下です:

C++11では、「std::strtol()などの関数を使用した変換結果の値が、結果型で表現可能な範囲を超えていたらエラー」という仕様はありました。

C++14にはこれに加えて、「変換に使用する内部関数std::strtol()が範囲外エラーになったらエラーとする」という仕様が追加されました。

今日はこれまで

まだ続きます。