gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:20:32 24 4
gpt4 key购买 nike

我最近收到了一个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 中的一个错误。这是一个最小的例子:

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

有趣的是,如果 externauto 声明颠倒过来,gcc 会很高兴。

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

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

After all adjustments of types (during which typedefs (7.1.3) are replaced by their definitions), the types specified by all declarations referring to a given variable or function shall be identical, except that declarations for an array object can specify array types that differ by the presence or absence of a major array bound (8.3.4). A violation of this rule on type identity does not require a diagnostic.

关于c++ - 外部函数指针声明和类型推断定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28835198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com