【问题标题】:Is it well-formed, if I redefine a variable as auto, and the deduced type is the same? [duplicate]如果我将变量重新定义为 auto 并且推导的类型相同,它是否格式正确? [复制]
【发布时间】:2018-09-12 22:41:45
【问题描述】:

看看这个sn-p:

int a;
extern int b;
auto b = a;

格式是否正确? Clang 可以成功编译,但是 GCC 和 MSVC 没有。

(我回复How to declare and define a static member with deduced type?时就出现了这个问题)

【问题讨论】:

  • 我相信[dcl.spec.auto]p5 是这里的关键措辞,感觉措辞应该明确涵盖这种情况,但事实并非如此,因此它最终格式不正确。
  • @ShafikYaghmour:如果我从逻辑上思考,b 被声明为int。然后,它被定义为int(因为auto被推导出为int)。所以它应该是格式良好的。如果标准希望 this 格式不正确,则标准应该另有说明,就像它对函数这样做一样。
  • 当然,从逻辑上讲,但标准措辞另有说明……也许这是一个缺陷……还不确定。我正在与其他语言律师联系以查看,但我认为我的分析是正确的。
  • 如果格式不正确,那么这意味着用auto 定义全局变量将是格式不正确的,除非您采取特殊措施确保 extern 声明在包含在与它声明的全局定义相同的翻译单元。这对我来说似乎有点荒谬。
  • @Galik 我在 Twitter 上收到了 Richard Smith 的回复,他似乎同意 clang 是正确的。

标签: c++ language-lawyer auto variable-declaration


【解决方案1】:

ClangGCCMSVC。 (这个答案之前说所有 3 个编译器都会拒绝构建它,但这是不正确的。)

dcl.spec.auto 未解决在将 auto 类型说明符与其他类型说明符混合时同一变量的多个声明的兼容性。但是,它addresses it for function return types

auto f();
auto f() { return 42; } // return type is int
auto f();               // OK
int f();                // error, cannot be overloaded with auto f()
decltype(auto) f();     // error, auto and decltype(auto) don't match

所以我的直觉是,这是对标准的疏忽,并且行为目前未指定,但如果/当它被指定时,会有先例将其定为非法。 (另一方面,变量不能重载,谁知道呢。)

【讨论】:

  • 这是什么意思:“变量不能重载,所以谁知道”?在这种情况下,为什么函数可以重载很重要?
  • @geza,我觉得解析函数类型时比解析变量类型时存在更多歧义。如果您有不同的看法,请随意丢弃该评论并假设您的构造是非法的。
【解决方案2】:

Tl;DR;

clang 是正确的,逻辑是 [dcl.spec.auto] 允许这样做,并且添加了 [dcl.spec.auto]p11 的推导返回类型限制,否则没有限制,因此对于变量情况没有限制。

my more complete answer in the duplicate

【讨论】:

  • 如前所述,我看不到 [dcl.spec.auto]p5 在这里如何应用。 auto b = a;auto 的有效用法。
  • 如果您愿意,您可以在副本上重新发布并删除此答案。或者,您可以在此处提供更简短的答案,链接到副本上更通用/更广泛的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-24
相关资源
最近更新 更多