gpt4 book ai didi

c++ - 使用 "auto"的声明是否匹配使用具体类型说明符的 extern 声明?

转载 作者:可可西里 更新时间:2023-11-01 17:59:55 30 4
gpt4 key购买 nike

考虑以下程序:

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

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

最佳答案

令人惊讶的是,标准中关于此的内容很少。我们听到的关于重新声明的所有信息是:

[C++11: 3.1/1]: A declaration (Clause 7) may introduce one or more names into a translation unit or redeclare names introduced by previous declarations. [..]

auto语义的唯一相关部分:

[C++11: 7.1.6.4/3]: Otherwise, the type of the variable is deduced from its initializer. [..]

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

我们知道一个变量必须被所有的声明赋予相同的类型:

[C++11: 3.5/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.

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

我相信 GCC 和 Visual Studio 正在从以下内容中汲取灵感:

[C++11: 7.1.6.4/5]: A program that uses auto in a context not explicitly allowed in this section is ill-formed.

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

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

[C++14: 7.1.6.4/13]: Redeclarations or specializations of a function or function template with a declared return type that uses a placeholder type shall also use that placeholder, not a deduced type. [..]

通过对称性,有人可能会建议,在您的 int 案例中,GCC 和 VS 在拒绝程序方面是正确的。然而,这是一个不同的特性(因为演绎不能应用于单纯的声明),因此是一个不同的场景。

无论哪种方式,改进的标准措辞都会有所帮助。我认为这是一个 [相当小的] 编辑缺陷。

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

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