【问题标题】:What type does `n` in `const n = 1u;` have?`const n = 1u;`中的`n`有什么类型?
【发布时间】:2018-02-19 09:14:40
【问题描述】:

[编辑:下面讨论的声明在 C++ 和现代 C 中是无效的;他们依赖于后来被删除的 C 语言的“隐式 int”规则。 Herb Sutter 讨论了更改 in a reader Q&A。感谢评论者和 user2079303 指出这一点。]

我想知道 C++ 中 const 变量类型的推断。

我们的旧编译器编译声明const n = 1;。我假设n 将具有const int 类型。我认为int 不是从初始化表达式(1)的类型推断出来的,而是一个简单的语法规则。

那么const n = 1u; 中的 n 是什么类型?我会假设它也是int,但在 C++17 标准草案中找不到规则(这让我想知道它是否实际上是非法的但被宽松的编译器容忍)。同样令人感兴趣的是 C 是否会有所不同,因此这两个标签。

【问题讨论】:

  • const n = 1 不应该在 C++ 中编译。
  • const n = 1; 在现代 C 中也是无效的。
  • @user463035818 在 C89 中,C 具有允许它的“隐式 int”规则。但它自 C99 以来已被删除,这是有充分理由的。
  • 如果你想要推断的类型,那么你需要把它拼出来。 const auto n = 1u; 否则你只有一个格式错误的声明。
  • @user463035818 C 曾经是一门非常简单的语言,如果你只想要int,就不需要到处都需要类型。例如,您可以声明没有类型的函数参数,默认为int。我自己没有见过const n = 1,但我相当肯定它曾在“史前”时代被允许。

标签: c++ c types constants variable-declaration


【解决方案1】:

const n = 1u; 中的n 是什么类型?我假设它也是int

在 C89/C90 中,类型为 int。有一条规则,如果声明中缺少类型名称,则默认为 int。自 C99 以来,该规则不存在,并且声明格式不正确。

在 C++ 中,从第一个标准版本开始,声明格式不正确。如果要推断类型为unsigned int,可以使用const auto n = 1u;,从C++11开始。在C语言中,auto没有自动类型推断的含义。

unsigned 中的隐式 int -> unsigned intshort -> short int 等在两种语言中仍然存在。

【讨论】:

  • 谢谢。我不知道它在 C++ 中是非法的。我们 1990 年代后期的编译器会编译它。 (在标准没有提到这种可能性之后,我确实开始怀疑。)也感谢 C 进化的信息。我知道隐含的 int 规则,并且这种情况只是它的应用是有道理的。
  • @PeterA.Schneider “我不知道它在 C++ 中是非法的”与帖子的“下面讨论的声明在 C++ 中无效”相矛盾。建议回滚编辑。看起来您的编辑属于答案,而不是问题更新。
  • @chux 是的,我不知道如何正确处理。方括号中的注释表示它不是原始问题的一部分。但最初的问题是陈述了一些事实错误,我认为应该更正或至少标记为在问题中。我认为这是对这个问题的改进。或者,可以简单地删除该问题,但我认为这是其他人可以遇到的问题。
  • @Aconcagua 澄清一下:Pre C++11 auto 与 Post C++11 auto 的含义不同。它确实与 C 中的 auto 具有相同的含义(存储类的含义)。我不认为在标准化后 C 或 C++11 之前明确使用 auto 是没有必要的,因为自动存储持续时间是隐式的。
  • @user2079303 非常清楚 - 只是想你提到 C 的意思,你可能已经在你的答案中添加了 pre-C++11 的意思完整性。没关系...
猜你喜欢
  • 2020-11-11
  • 2016-05-11
  • 2016-09-09
  • 2013-09-09
  • 2016-01-24
  • 2011-04-30
  • 2016-04-15
  • 1970-01-01
  • 2011-04-18
相关资源
最近更新 更多