隐式函数到函数指针转换不适用于std容器(例如向量) 我最近知道,只要有必要,C++就可以执行。例如,在下面的示例中,my_func_1和my_func_2是等效的。但是,vector_1和vector_2不是,事实上,vector_2将给出编译错误。其他标准容器也会出现类似的编译错误,例如,unordered\u map。为什么会这样 class my\u class{ //虚拟类 }; int main(){ 向量向量_1;//正确的一个 vector vector_2;//给出编译错误 //但是,以下两项都可以,因为 //函数到函数指针转换 取消我的职能1(我的班级(*)()); void my_func_2(my_class());//与上面的相同 }

隐式函数到函数指针转换不适用于std容器(例如向量) 我最近知道,只要有必要,C++就可以执行。例如,在下面的示例中,my_func_1和my_func_2是等效的。但是,vector_1和vector_2不是,事实上,vector_2将给出编译错误。其他标准容器也会出现类似的编译错误,例如,unordered\u map。为什么会这样 class my\u class{ //虚拟类 }; int main(){ 向量向量_1;//正确的一个 vector vector_2;//给出编译错误 //但是,以下两项都可以,因为 //函数到函数指针转换 取消我的职能1(我的班级(*)()); void my_func_2(my_class());//与上面的相同 },c++,function-pointers,C++,Function Pointers,以下是编译错误消息(缩短以突出显示错误): /usr/bin/./lib/gcc/x86_64-linux-gnu/9/../../../../../../../../include/c++/9/ext/new_分配器.h:96:7:错误:“地址”的多个重载实例化为同一签名“u gnu cxx::new_分配器::const_指针(u gnu cxx::new_分配器::const_引用)const noexcept'(也称为“my_类(*(my U类)(&))const noexcept)”

以下是编译错误消息(缩短以突出显示错误):

/usr/bin/./lib/gcc/x86_64-linux-gnu/9/../../../../../../../../include/c++/9/ext/new_分配器.h:96:7:错误:“地址”的多个重载实例化为同一签名“u gnu cxx::new_分配器::const_指针(u gnu cxx::new_分配器::const_引用)const noexcept'(也称为“my_类(*(my U类)(&))const noexcept)” 地址(常量引用)常量GLIBCXX\u无例外 ^ /usr/bin/./lib/gcc/x86_64-linux-gnu/9/../../../../../../../../../include/c++/9/bits/allocator.h:112:30:注意:在模板类的实例化中,此处请求了“u gnu cxx::new_allocator” 类分配器:公共\uuu分配器\u基 ^ /usr/bin/./lib/gcc/x86_64-linux-gnu/9/../../../../../../../../include/c++/9/ext/alloc_traits.h:49:47:注意:在此处请求的模板类“std::allocator”的实例化中 样板 ^ /usr/bin/./lib/gcc/x86_64-linux-gnu/9/../../../../../../../../include/c++/9/bits/stl_vector.h:83:35:注意:此处需要实例化“u alloc_traits”的默认参数 typedef typename__gnu_cxx::_alloc_traits::template ^~~~~~~~~~~~~~~~~~~~~~ /usr/bin/./lib/gcc/x86_64-linux-gnu/9/../../../../../../../../include/c++/9/bits/stl_vector.h:386:30:注意:在这里请求的模板类“std:_vector_base”的实例化中 类向量:受保护的_向量_基 ^ 第7行:Char 24:注意:在这里请求的模板类“std::vector”的实例化中 向量向量_2;//给出编译错误 ^ /usr/bin/./lib/gcc/x86_64-linux-gnu/9/../../../../../../../../../include/c++/9/ext/new_allocator.h:92:7:注意:前面的声明在这里 地址(参考)常数GLIBCXX无例外 ^

在本宣言中:

vector<my_class()> vector_2; 
作为
std::vector
的模板参数使用的类型的一个要求是具有副本可分配性,因此此声明不会编译


其余的声明都可以:

vector<my_class(*)()> vector_1; // vector of function pointer type

这种转变并非无处不在。正如您所注意到的,它发生在函数参数中,而不是在模板参数中。不,它不是函数类型
my_class()
,而是类型
my_class
的r值。下面的示例证明
my_class()
不是函数类型:`decltype(myclass())a;a、 foo();`我们假设
my_class
有一个名为
foo
的成员函数,那么该调用成功。@Maestro否,它是一个函数类型
myu类{}
将是
myu类
类型的r值。比较不同的错误。只有第二个类型/值不匹配。您是否使用了
decltype(my_calss())
?@Maestro好的,这肯定是我在这里要回答的最后一个问题:)不,它完全是
my_class
,因为
decltype
将处理
my_class()
作为类型为
my_class
的对象的直接初始化表达式。当然,
decltype
是一个未计算的上下文,因此没有实际创建对象,但这就是您将获得的类型。
vector<my_class(*)()> vector_1; // vector of function pointer type
void my_func_1(my_class(*)());  // function taking a function pointer 
                                // to a function that takes no arguments
                                // and returns a my_class

void my_func_2(my_class());     // function taking a function that takes no 
                                // arguments and returns a my_class