その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()
が範囲外エラーになったらエラーとする」という仕様が追加されました。
今日はこれまで
まだ続きます。