C++1z swap可能かを判定する型特性クラス

swap操作をラップした関数のnoexcept条件を書きやすくすることを主な目的として、C++1zから以下の型特性クラスが追加されます。

  • Tswap可能かを判定する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;
}

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。