Ksa*_*euk 12 c++ function-pointers c++11
我最近收到的代码被clang ++接受但不是g ++,我想知道哪一个是正确的.
再现行为的极简主义代码非常短并且单独说话,所以我认为解释会不必要地复杂化.
这是一个包含extern指针声明的标头:
//(guards removed for simplicity) :
#include <type_traits>
using ptr_func = std::add_pointer<void()>::type;
extern ptr_func pointer;
Run Code Online (Sandbox Code Playgroud)
以下是实现所需指向函数的源代码:
#include "function.hh"
void foo() {}
auto pointer = &foo;
Run Code Online (Sandbox Code Playgroud)
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;
^
Run Code Online (Sandbox Code Playgroud)
Clang接受此代码时没有任何错误/警告.并通过以下方式替换指针定义:
decltype(foo)* pointer = &foo;
Run Code Online (Sandbox Code Playgroud)
被gcc接受.
在我看来,clang是对的,但我不确定所以我想知道clang是否过于宽松或者gcc是否应该接受它.
这肯定是gcc中的一个bug.这是一个最小的例子:
int foo;
extern int* ptr;
auto ptr = &foo;
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果extern和auto声明相反,gcc很高兴.
这似乎与去年报道的https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60352相同.
相关条款是[basic.link]/10:
在对类型进行所有调整之后(其中typedefs(7.1.3)被其定义替换),引用给定变量或函数的所有声明指定的类型应该是相同的,除了数组对象的声明可以指定数组类型是否存在主阵列界限(8.3.4).违反此规则的类型标识不需要诊断.