函数指针的vector:不同的模板形参

std::vector of function pointers: different template parameters

本文关键字:形参 指针 vector 函数      更新时间:2023-10-16

为什么下面的代码可以编译

std::vector<int(*)(double)> func_ptrs;

但这不是

std::vector<int(double)> func_ptrs

?

在第二种情况下,我得到了一个丑陋的STL错误消息,所以我不打算把所有东西都放在这里,但在消息的末尾,我得到了这个

/usr/include/c++/4.8/bits/stl_construct.h:102:30: error: ISO C++ forbids incrementing a pointer of type ‘int (*)(double)’ [-fpermissive]
for (; __first != __last; ++__first)

这似乎暗示c++将类型int(double)强制转换为int (*) (double)。我的印象是int(*)(double)int(double)是相等的。还是我错了?

我想要一些澄清。

int(double)实际上是一个函数类型,而不是函数指针。在许多情况下,它衰减为函数指针,但在这里不是。例如,您不能将sizeof与函数类型一起使用,这对于vector的分配器至关重要。

至于你的具体错误:add_pointer_t<int(double)>(或多或少由vector的迭代器内部或直接使用)是int(*)(double),不能加1,因为执行这样的操作没有意义。