外部函数指针声明和类型推断定义

时间:2015-03-03 15:08:25

标签: c++ c++11 function-pointers

我最近收到的代码被clang ++接受但不是g ++,我想知道哪一个是正确的。

复制行为的极简主义代码很短,并且单独说话,所以我认为解释会不必要地复杂化。

这是一个包含extern指针声明的标题:

//(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接受。

在我看来,铿锵是对的,但我不确定,所以我想知道铿锵是否过于宽容,或者gcc是否应该接受它。

1 个答案:

答案 0 :(得分:6)

这绝对是gcc中的一个错误。这是一个最小的例子:

int foo;
extern int* ptr;
auto ptr = &foo;

有趣的是,如果externauto声明被撤销,gcc会很高兴。

这似乎与去年报道的https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60352相同。

相关条款是 [basic.link] / 10:

  

在对类型进行所有调整(其中typedefs(7.1.3)被其定义替换之后),类型   引用给定变量或函数的所有声明指定的内容应相同,但声明除外   对于数组对象,可以指定由主数组的存在与否而不同的数组类型   约束(8.3.4)。违反此规则的类型标识不需要诊断。