C++ 为什么std::is_invocable
我在查看std::thread构造函数时遇到了这个问题: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
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"
);