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_invocableのapply版である。
要件
型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
処理系
- Clang: 22 ❌
- GCC: 15 ❌
- Visual C++: 2026 Update 2 ❌