[英]How to interpret this C++ type?
今天我正在帮助跟踪不正确的代码片段( func
是用int
param声明的,但int*
作为第二个param传递给std::thread
构造函数):
#include <thread>
void func(int);
int* ptr;
void start()
{
std::thread t = std::thread(func, ptr);
}
当我尝试使用gcc 5.3.0编译它时,它打印了以下类型的错误消息:
class std::result_of<void (*(int*))(int)>
现在我想知道如何将作为参数传递的类型解释为class std::result_of<>
。 它类似于指向函数的指针(在本例中为void(*)(int)
),但在括号中的星号之后使用extra (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)
方法是:
一个函数,它接受int*
类型的单个参数作为返回
指向函数的指针,该函数接受int
类型的单个参数并返回
void
它类似于C / C ++标准库函数信号 :
void (*signal(int sig, void (*func)(int)))(int);
它返回一个指向前一个信号处理程序的指针(与func
参数的类型相同)。
编辑:正如Pete Becker在评论中指出的那样 ,当与std::result_of
,它意味着不同的东西 ,但表达式本身仍然是我描述的类型, std::result_of
只是以不同的方式解释它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.