[英]Implicit function-to-function-pointer conversion not working for std containers (e.g. vector)
我最近了解到 C++ 可以在必要时执行隐式函数到函数指针转换。 例如,在下面的示例中, my_func_1
和my_func_2
是等价的。 但是vector_1
和vector_2
不是,实际上vector_2
会报编译错误。 其他标准容器也会发生类似的编译错误,例如unordered_map
。 为什么会这样?
class my_class {
// dummy class
};
int main() {
vector<my_class(*)()> vector_1; // correct one
vector<my_class()> vector_2; // gives compile error
// However, both of the below are OK due to implicit
// function-to-function-pointer conversion
void my_func_1(my_class(*)());
void my_func_2(my_class()); // equivalent to the one above
}
这是编译错误消息(缩短以突出显示错误):
/usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/ext/new_allocator.h:96:7:错误: 'address' 的多个重载实例化为相同的签名 '__gnu_cxx::new_allocator<my_class ()>::const_pointer (__gnu_cxx::new_allocator<my_class ()>::const_reference) const noexcept' (又名 'my_class (*(my_class ( &)()) const noexcept)()') 地址(const_reference __x) const _GLIBCXX_NOEXCEPT ^ /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../。 ./include/c++/9/bits/allocator.h:112:30: 注意:在模板 class '__gnu_cxx::new_allocator<my_class ()>' 的实例化中 class< allocator: public __gnu_cxx::new_allocator<my_class ()>' bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/ext/alloc_traits.h:49:47:注意:在实例化模板 class 'std::allocator<my_class ()>' 在这里请求模板<typename _Alloc, typename = typename _Alloc::value_type> ^ /usr/bin/../lib/gcc/x86_64-linux-g nu/9/../../../../include/c++/9/bits/stl_vector.h:83:35: 注意:在 '__alloc_traits<std::allocator<my_class ( )>>' 这里需要 typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template ^~~~~~~~~~~~~~~~~~~~~~ /usr/bin/../lib/ gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:386:30:注意:在模板 class 'std::_Vector_base 的实例化中<my_class (), std::allocator<my_class ()>>' 在此处请求 class 向量:受保护 _Vector_base<_Tp, _Alloc> ^ 第 7 行:字符 24:注意:在模板 class 'std::vector<my ), std::allocator<my_class ()>>' 在这里请求 vector<my_class()> vector_2; // 给出编译错误 ^ /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/ext/new_allocator.h: 92:7:注意:之前的声明在这里地址(参考 __x)const _GLIBCXX_NOEXCEPT ^
在此声明中:
vector<my_class()> vector_2;
用于实例化向量的类型是myclass()
,它是 function 类型。 具体来说,它是一个 function ,它不接受 arguments,并返回一个my_class
。
一个 function 类型是不可复制分配的,从这个测试可以看出:
static_assert(not std::is_copy_assignable_v<Foo()>);
可复制分配是对用作std::vector
模板参数的类型的要求之一,因此此声明无法编译。
其余的声明很好:
vector<my_class(*)()> vector_1; // vector of function pointer type
由于隐式转换为 function 参数中使用的类型的函数指针,以下声明是等效的:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.