最終更新日時(UTC):
が更新

履歴 編集

class template
<type_traits>

std::is_swappable(C++17)

namespace std {
  template <class T>
  struct is_swappable;

  template <class T>
  inline constexpr bool is_swappable_v = std::is_swappable<T>::value;
}

概要

Tの値同士が、swap関数によって入れ替え可能かどうかを調べる。

要件

Tが、完全型であること。もしくはconst/volatile修飾された(あるいはされていない)voidか、要素数不明の配列型であること。

効果

Tstd::swappable要件を満たしていればtrue_typeから派生し、そうでなければfalse_typeから派生する。

参照可能な型に対して、is_swappable_with<T&, T&>::valueと同じ結果となり、参照可能でない型に対してはfalseとなる。

  • 参照可能な型とは、以下のいずれかの条件に合致する型である:
    • オブジェクト型
    • CV修飾されていない、もしくは参照修飾されていない関数型
    • 参照修飾されている型

備考

このメタ関数はTについてのswap関数の直接のコンテキストの妥当性(そのシグネチャで有効なswapがあるかどうか)のみをチェックする。そのため、結果がtrueとなったとしてもswap関数の呼び出しができることは保証されない(その他の要因によりコンパイルエラーが発生する可能性がある)。

また同様に、結果がtrueとなっても見つかったswap関数がswap動作をするかどうかも保証しない。

#include <type_traits>
#include <iostream>

struct non_swappable {};

void swap(non_swappable&, non_swappable&) = delete;

int main()
{
  std::cout << std::boolalpha;

  std::cout << std::is_swappable<int>::value << std::endl;
  std::cout << std::is_swappable<non_swappable>::value << std::endl;
}

出力

true
false

バージョン

言語

  • C++17

処理系

  • Clang: ??
  • GCC: ??
  • Visual C++: 2015 update3, 2017
    • 2015 update3では、インテリセンスで表示されないが変数テンプレート共々定義されており利用可能である

参照