【发布时间】:2015-05-04 07:18:38
【问题描述】:
我最近收到了一个clang++接受但g++不接受的代码,我想知道哪个是正确的。
重现该行为的极简代码非常简短,并且可以自行说明,因此我认为解释会不必要地复杂。
这是一个包含外部指针声明的标题:
//(guards removed for simplicity) :
#include <type_traits>
using ptr_func = std::add_pointer<void()>::type;
extern ptr_func pointer;
这是实现所需指向功能的源代码:
#include "function.hh"
void foo() {}
auto pointer = &foo;
gcc产生的错误如下:
g++ -c function.cc -std=c++14
function.cc:5:6: error: conflicting declaration ‘auto pointer’
auto pointer = &foo;
^
In file included from function.cc:1:0:
function.hh:5:17: note: previous declaration as ‘void (* pointer)()’
extern ptr_func pointer;
^
Clang 接受此代码,没有任何错误/警告。并将指针定义替换为:
decltype(foo)* pointer = &foo;
被 gcc 接受。
在我看来,clang 是对的,但我不确定,所以我想知道 clang 是否过于宽松,或者 gcc 是否应该接受它。
【问题讨论】:
-
究竟是哪个 GCC 版本?
-
我用g++4.9.1和g++4.9.2测试过
-
我已经使用
std::add_pointer<void (*)()>::type;(对我来说更像是一个有效的函数指针声明)在 Ideone 上测试了代码(认为它至少使用 g++4.9.1)。但它也不接受这一点。看起来 GCC 的std::add_pointer实现不适用于函数指针。 -
@πάνταῥεῖ
std::add_pointer<void (*)()>::type;将是指向指针的指针。这里的问题不在于add_pointer正常工作,而是auto推断类型与先前声明的类型。 -
这是一个完全不涉及指针的简单示例:
extern int x; auto x = 1; int main() {}。它也适用于 clang 但不适用于 gcc。
标签: c++ c++11 function-pointers