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

履歴 編集

class template
<type_traits>

std::is_nothrow_swappable(C++17)

namespace std {
  template <class T>
  struct is_nothrow_swappable;

  template <class T>
  inline constexpr bool is_nothrow_swappable_v
    = std::is_nothrow_swappable<T>::value;
}

概要

Tの値同士が、swap関数によって入れ替え可能であり、その際に例外を投げないかどうかを調べる。

要件

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

効果

Tstd::swappable要件を満たしており、見つかったswap関数がいかなる例外も投げない場合はtrue_typeから派生し、そうでなければfalse_typeから派生する。

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

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

備考

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

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

#include <type_traits>
#include <iostream>

struct spurious_swappable {};

void swap(spurious_swappable&, spurious_swappable&) {}

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

  std::cout << std::is_nothrow_swappable<int>::value << std::endl;

  //spurious_swappableは見かけ上はswap可能だが、swap関数にnoexceptが無いためnothrow_swappableではない
  std::cout << std::is_swappable<spurious_swappable>::value << std::endl;
  std::cout << std::is_nothrow_swappable<spurious_swappable>::value << std::endl;
}

出力

true
true
false

バージョン

言語

  • C++17

処理系

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

参照