考虑以下程序:
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/