# std::is_invocable, std::is_invocable_r, std::is_nothrow_invocable, std::is_nothrow_invocable_r

< cpp‎ | types

定义于头文件 `<type_traits>` |  |
template <class Fn, class... ArgTypes> struct is_invocable; | (1) | (C++17 起)
template <class R, class Fn, class... ArgTypes> struct is_invocable_r; | (2) | (C++17 起)
template <class Fn, class... ArgTypes> struct is_nothrow_invocable; | (3) | (C++17 起)
template <class R, class Fn, class... ArgTypes> struct is_nothrow_invocable_r; | (4) | (C++17 起)

1) 确定是否能以参数 `ArgTypes...` 调用 `Fn` 。正式而言，确定 `INVOKE(declval<Fn>(), declval<ArgTypes>()...)` 在被当做不求值运算数时是否为良式，其中 `INVOKE` 是 可调用 (Callable) 中定义的运算。
2) 确定是否能以参数 `ArgTypes...` 调用 `Fn` 并生成可转换为 `R` 的结果。正式而言，确定 `INVOKE<R>(declval<Fn>(), declval<ArgTypes>()...)` 在被当做不求值运算数时是否为良式，其中 `INVOKE` 是 可调用 (Callable) 中定义的运算。
3) 确定是否能以参数 `ArgTypes...` 调用 `Fn` （同 (1) ），并已知这种调用不抛任何异常。
4) 确定是否能以参数 `ArgTypes...` 调用 `Fn` 并生成可转换为 `R` 的结果（同 (2) ），并已知这种调用（包括转换）不抛任何异常。

`Fn, R` 与参数包 `ArgTypes` 中的所有类型应均为完整类型、（可为 cv 限定的） void ，或未知边界数组。否则行为未定义。

若上述模板的实例化直接或间接地依赖于不完整类型，并且如果假如使该类型完整，实例化就会产生不同的结果，则行为未定义。

添加此页面上描述的任何模板的特化的程序行为未定义。

### 辅助变量模板

定义于头文件 `<type_traits>` |  |
template <class Fn, class... ArgTypes> inline constexpr bool is_invocable_v = std::is_invocable<Fn, ArgTypes...>::value; | (1) | (C++17 起)
template <class R, class Fn, class... ArgTypes> inline constexpr bool is_invocable_r_v = std::is_invocable_r<R, Fn, ArgTypes...>::value; | (2) | (C++17 起)
template <class Fn, class... ArgTypes> inline constexpr bool is_nothrow_invocable_v = std::is_nothrow_invocable<Fn, ArgTypes...>::value; | (3) | (C++17 起)
template <class R, class Fn, class... ArgTypes> inline constexpr bool is_nothrow_invocable_r_v = std::is_nothrow_invocable_r<R, Fn, ArgTypes...>::value; | (4) | (C++17 起)

## 继承自 std::integral_constant

### 成员常量

value [静态] | 若 `INVOKE<R>(declval<Fn>(), declval<ArgTypes>()...)` 在被当做不求值运算数时为良式 则为 true ，否则为 false (公开静态成员常量)

### 成员函数

operator bool | 转换对象为 bool ，返回 `value` (公开成员函数)
operator() (C++14) | 返回 `value` (公开成员函数)

### 成员类型

类型 | 定义
`value_type` | `bool`
`type` | std::integral_constant<bool, value>

### 示例

    #include <type_traits>

    auto func2(char) -> int (*)()
    {
        return nullptr;
    }

    int main()
    {
        static_assert( std::is_invocable<int()>::value );
        static_assert( std::is_invocable_r<int, int()>::value );
        static_assert( std::is_invocable_r<void, void(int), int>::value );
        static_assert( std::is_invocable_r<int(*)(), decltype(func2), char>::value );
    }

### 参阅

invoke invoke_r (C++17)(C++23) | 以给定实参和可能指定的返回类型 (C++23 起)调用任意可调用 (Callable) 对象 (函数模板)
result_of invoke_result (C++11)(C++20 中移除)(C++17) | 推导以一组实参调用一个可调用对象的结果类型 (类模板)
declval (C++11) | 获取到其实参的引用，用于不求值语境中 (函数模板)