今天我正在帮助跟踪不正确的代码片段(func用intparam 声明,但int*作为第二个参数传递给std::thread构造函数):
#include <thread>
void func(int);
int* ptr;
void start()
{
std::thread t = std::thread(func, ptr);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用gcc 5.3.0编译它时,它打印了以下类型的错误消息:
class std::result_of<void (*(int*))(int)>
Run Code Online (Sandbox Code Playgroud)
现在我想知道如何解释作为参数传递的类型class std::result_of<>.它类似于指向函数的指针(在这种情况下void(*)(int)),但(int*)括号中有额外的后星.如何解释这种类型?
这并不像看起来那么简单. std::result_of滥用类型系统来走私有关函数调用的信息,以便它可以找出该函数调用的返回类型.
std::result_of具有表单的参数Fty(T1, T2, ...),其中Fty是可调用类型T1等,是调用它的参数的类型.给定该信息,std::result_of具有名为的嵌套类型type,该类型是调用具有Fty给定类型的参数的签名的可调用类型的返回类型的同义词.哎呀,那是满口的.
因此,result_of<void (*(int*))(int)>模板参数有两个部分.第一部分是有void (*(int*))问题的可调用类型.在这种情况下,它是指向int*并返回的函数的指针void.第二部分是(int),建议参数的类型列表.
所以说的是std::result_of用一个函数实例化它的类型是void (*(int*))和一个参数列表(int).这就是问题所在,正如您所指出的:您不能将类型的参数传递int给带有类型参数的函数int*.
你问的不是很高兴吗?(顺便说一下,这是一个非常低级的模板hackery,不再需要了; decltype是一个更清晰的方法来计算函数调用的返回类型).
void (*(int*))(int)
Run Code Online (Sandbox Code Playgroud)
方法是:
将类型的单个参数int*作为返回的函数
指向函数的指针,该函数接受类型的单个参数int并返回
void
它类似于C/C++标准库函数信号:
void (*signal(int sig, void (*func)(int)))(int);
Run Code Online (Sandbox Code Playgroud)
它返回一个指向前一个信号处理程序的指针(与func参数的类型相同).
编辑:正如Pete Becker在评论中指出的那样,当使用std::result_of它时,它意味着不同的东西,但表达式本身仍然是我所描述的类型,std::result_of只是以不同的方式解释它.