C++ 为什么std::is_invocable

C++ 为什么std::is_invocable,c++,c++11,C++,C++11,我在查看std::thread构造函数时遇到了这个问题: void f(int&); ... auto* fp = f; int i = 0; std::invoke(fp, i); 我理解为什么向std::thread的构造函数传递引用是不合法的,我们仍然可以使用std::ref,但我不理解为什么void*int&不能用int调用。std::is\u invocable尝试使用int-rvalue作为参数。它相当于std::is\u invocable 使用std::is_invoc

我在查看std::thread构造函数时遇到了这个问题:

void f(int&);
...
auto* fp = f;
int i = 0;
std::invoke(fp, i);
我理解为什么向std::thread的构造函数传递引用是不合法的,我们仍然可以使用std::ref,但我不理解为什么void*int&不能用int调用。

std::is\u invocable尝试使用int-rvalue作为参数。它相当于std::is\u invocable

使用std::is_invocable

…形式上,决定是否调用eClVal、declval。。。结构合理

即使我们忽略了INVOKE是什么,您也可以看到is_invocable是使用std::declval定义的,它返回ArgType&&

ArgType&&是一个右值引用。除非ArgType是左值引用,否则在这种情况下,ArgType&&相当于ArgType,并且根据引用折叠规则是左值引用。

std::is\u invocable尝试使用int-rvalue作为参数。它相当于std::is\u invocable

使用std::is_invocable

…形式上,决定是否调用eClVal、declval。。。结构合理

即使我们忽略了INVOKE是什么,您也可以看到is_invocable是使用std::declval定义的,它返回ArgType&&

ArgType&&是一个右值引用。除非ArgType是左值引用,否则在这种情况下,ArgType&&相当于ArgType,并且根据引用折叠规则是左值引用

void f(int&);
...
auto* fp = f;
int i = 0;
std::invoke(fp, i);
 template<typename _Callable, typename... _Args,
             typename = _Require<__not_same<_Callable>>>
      explicit
      thread(_Callable&& __f, _Args&&... __args)
      {
        static_assert( __is_invocable<typename decay<_Callable>::type,
                                      typename decay<_Args>::type...>::value,
          "std::thread arguments must be invocable after conversion to rvalues"
          );