swap操作をラップした関数のnoexcept
条件を書きやすくすることを主な目的として、C++1zから以下の型特性クラスが追加されます。
- 型
T
がswap
可能かを判定するis_swappable<T>
- 型
T
と型U
の組み合わせでswap
可能かを判定するis_swappable_with<T, U>
- 例外を送出せずに
swap
可能かを判定するis_nothrow_swappable<T>
とis_nothrow_swappable_with<T, U>
- この4つの変数テンプレート版
たとえば、これまで以下のように宣言されていた組み込み配列版のswap
関数は、
// <utility> namespace std { template <class T, size_t N> void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b))); }
C++1zでは以下のような宣言になります。
// <utility> namespace std { template <class T, size_t N> void swap(T (&a)[N], T (&b)[N]) noexcept(is_nothrow_swappable<T>::value); }
宣言
// <type_traits> namespace std { template <class T, class U> struct is_swappable_with; template <class T> struct is_swappable; template <class T, class U> struct is_nothrow_swappable_with; template <class T> struct is_nothrow_swappable; // 変数テンプレート版 template <class T, class U> constexpr bool is_swappable_with_v = is_swappable_with<T, U>::value; template <class T> constexpr bool is_swappable_v = is_swappable<T>::value; template <class T, class U> constexpr bool is_nothrow_swappable_with_v = is_nothrow_swappable_with<T, U>::value; template <class T> constexpr bool is_nothrow_swappable_v = is_nothrow_swappable<T>::value; }
参照
- N4426 Adding [nothrow-]swappable traits
- N4511 Adding [nothrow-]swappable traits, revision 1
- P0185R0 Adding [nothrow-]swappable traits, revision 2
- P0185R1 Adding [nothrow-]swappable traits, revision 3
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。