是否可以将变量重新声明为推导为相同类型的自动变量

Can a variable be redeclared as auto that deduced to the same type?

本文关键字:变量 同类型 声明 新声明 是否      更新时间:2023-10-16

标准允许以下内容吗?

#include <iostream>
extern int a;
auto a = 3;
int main(int, char**)
{
    std::cout << a << std::endl;
    return 0;
}

叮当接受代码。G++ 抱怨声明冲突。

从标准中我不太清楚,但是,有这个写的

第 7.1.6.4 节 自动说明符
在本节中未明确允许的上下文中使用 auto 的程序格式不正确。

最好阅读所有允许上下文的标准中提到的部分。

考虑到这一点,我认为g++是正确的,而clang是错误的。但我可能是错的,标准中可能有一些单独的部分可能暗示了这种上下文,但我找不到它。

编辑答案:正如评论中提到的。在这种情况下,问题是写作

external int a;
auto a = 3;

和写作一样

external int a;
int a = 3;

这意味着您有一个新的 a 定义,这会导致错误。

第一个答案:据我了解,这打破了"一个定义"规则的一部分。具体来说,我指的是以下规则(参考MISRA C++ 2008),即具有外部链接的标识符应始终只有一个定义。在您的示例中,您在当前文件( auto a = 3; ) 中有一个定义,对于外部文件,您还引用另一个文件中的定义。