小编Ksa*_*euk的帖子

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

我最近收到的代码被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是否应该接受它.

c++ function-pointers c++11

12
推荐指数
1
解决办法
437
查看次数

标签 统计

c++ ×1

c++11 ×1

function-pointers ×1