如何解释这个C ++类型?

时间:2016-06-15 20:05:20

标签: c++ gcc types

今天我正在帮助跟踪错误的代码片段(funcint param一起声明,但int*作为第二个参数传递给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)),但在括号中的星号之后加上(int*)。如何解释这种类型?

2 个答案:

答案 0 :(得分:7)

这并不像看起来那么简单。 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是一种更清晰的方法来计算函数调用的返回类型。)

答案 1 :(得分:5)

void (*(int*))(int)

时:

一个函数,它将int*类型的单个参数作为返回

指向函数的指针,该函数接受类型int的单个参数并返回

void

它类似于C / C ++标准库函数signal

void (*signal(int sig, void (*func)(int)))(int);

返回指向前一个信号处理程序的指针(与func参数的类型相同)。

编辑:与Pete Becker pointed out in comment一样,当与std::result_of一起使用时,它means something different,但表达式本身的类型仍然是我描述的类型,std::result_of只是以不同的方式解释它。

相关问题