考虑以下程序:

extern int x;
auto x = 42;
int main() { }

Clang 3.5接受(live demo),GCC 4.9和VS2013不接受(live demo for the former)。谁是正确的,在C++标准中指定了正确的行为?

最佳答案

标准中对此几乎没有什么令人惊讶的。关于重声明,我们听到的所有信息是:



以及auto语义的唯一相关部分:



(提醒我们x的类型是int)。

我们知道,所有声明都必须为变量赋予相同的类型:



“毕竟类型的调整”应该解决有关auto参与所有这些的任何问题;那么,我的解释是本质上是在全局范围内使用x类型的int的有效重新声明(和定义),并且Clang是正确的。即使我们建议auto不算作“类型调整”,因为不需要诊断,最糟糕的是所有列出的实现都以自己的方式兼容。

我相信GCC和Visual Studio将从以下方面得到启发:



…但是我认为这是短视的。标准语言似乎不可能禁止通常的重新声明规则,只是因为它们没有在7.1.6.4中被重复或未明确引用。

C++ 14增加了与推导类型的函数声明有关的措辞:



出于对称性,有人可能会建议,在您的int情况下,意图是GCC和VS在拒绝该程序方面是正确的。但是,这是一个不同的功能(因为不能将推论应用于单纯的声明),因此是一个不同的方案。

无论哪种方式,改进的标准措辞都会在这里有所帮助。我认为这是[合理的次要]编辑缺陷。

关于c++ - 使用 "auto"的声明是否与使用具体类型说明符的extern声明匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50907833/

10-11 23:11
查看更多