その1、その2、その3、その4、その5に引き続き、C++14の標準ライブラリに入った小さな変更を紹介していきます。
unique_ptr::reset(nullptr_t)の仕様を追加
配列版std::unique_ptr<T[]>
クラスの、nullptr
を受け取るreset()
メンバ関数の仕様が、これまで未規定でした。C++14で、以下の仕様が規定されました。
reset(pointer())と同等の効果を持つ。
つまり、p.reset()
するのと同じです。
allocator_traits::max_sizeのパラメータにconstを追加
単なる付け忘れです。
static size_type max_size(Alloc& a); // C++11 static size_type max_size(const Alloc& a) noexcept; // C++14
is_signedとis_unsignedの符号判定の条件式を修正
C++11のstd::is_signed
では、以下の条件式で、算術型であることとその符号あるなしを判定していました。
is_arithmetic<T>::value && T(-1) < T(0)
しかし、算術型以外が渡された場合、T(-1) < T(0)
という式でテンプレートの置き換え失敗が発生してしまうので、C++14で以下のように修正されました。
is_arithmetic<T>::value == trueの場合、integral_constant<bool, T(-1) < T(0)>::valueの 結果を真偽の結果とする。そうでなければ偽の結果とする。
std::is_unsigned
も同様です。
is_destructibleに、オブジェクト型以外が渡された場合の仕様を追加
std::is_destructible
は、C++11では以下のようにして破棄可能であると判定していました。
型Tが完全型で template <class U> struct test { U u; }; があるときに test<T>::~test() がdelete宣言されていなければ、 型Tは破棄可能であると判断される。
この仕様では、オブジェクト型以外に対しては、未規定となっています。
C++14で、以下のように修正されました。
実行時に評価されない文脈で、オブジェクト型Tに対する式std::declval<T&>().~T()が有効であれば破棄可能、 そうでなければ破棄できないと判断される。 以下、オブジェクト型に含まれない型の場合の判断について記載する: ・Tがvoidの場合は破棄できない ・Tが参照型の場合は破棄可能 ・Tが関数型の場合は破棄できない
今日はここまで
まだ続きます。