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

履歴 編集

class template
<type_traits>

std::is_nothrow_applicable(C++26)

namespace std {
  template <class F, class Tuple>
  struct is_nothrow_applicable;

  template <class F, class Tuple>
  inline constexpr bool is_nothrow_applicable_v
    = std::is_nothrow_applicable<F, Tuple>::value;
}

概要

関数呼び出し可能な型Fに対して、tuple-likeな型Tupleの要素を展開してapplyによる呼び出しが可能であり、かつその呼び出しに際して例外を投げないかどうかを調べる。

is_nothrow_invocableapply版である。

要件

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

効果

ELEMS-OF(T)を、make_index_sequence<tuple_size_v<remove_reference_t<T>>>が示すindex_sequenceの特殊化のテンプレート引数であるsize_tのパラメータパックNに対する、パラメータパックget<N>(declval<T>())とする。

is_applicable_v<F, Tuple>trueであり、かつ式INVOKE(declval<F>(), ELEMS-OF(Tuple)...)がいかなる例外も投げない場合true_typeから派生し、そうでなければfalse_typeから派生する。

#include <tuple>
#include <type_traits>
#include <iostream>

int add(int a, int b) noexcept { return a + b; }
int may_throw(int a, int b) { return a + b; }

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

  // add(int, int) noexcept
  std::cout << std::is_nothrow_applicable_v<decltype(&add), std::tuple<int, int>> << std::endl;

  // may_throw(int, int) は noexcept ではない
  std::cout << std::is_nothrow_applicable_v<decltype(&may_throw), std::tuple<int, int>> << std::endl;

  // 呼び出し不可能
  std::cout << std::is_nothrow_applicable_v<decltype(&add), std::tuple<int>> << std::endl;
}

出力

true
false
false

バージョン

言語

  • C++26

処理系

関連項目

参照