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

その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が関数型の場合は破棄できない

今日はここまで

まだ続きます。