【问题标题】:Will automatic return type deduction work for main?自动返回类型扣除是否适用于 main?
【发布时间】:2013-06-12 15:59:40
【问题描述】:

我能否在 C++1y (C++14) 中对 main 函数执行以下操作:

auto main()
{
    // ...
}

即使我们不需要使用显式的return 0;,返回类型是否会自动为int

【问题讨论】:

  • 这不是“您实际面临的实际问题”,对吧?
  • @DanielFischer 谁在乎?这是一个有趣(无用)的边缘案例。
  • 为什么? autoint 长一个字母。
  • 编译器编写者必须为此编写一个特殊规则。他们为什么要这样做?
  • @DavidHeffernan 他们必须为隐式return 0; 写一条特殊规则。

标签: c++ c++14


【解决方案1】:

不,不允许。 C++14 标准草案 N3690 第 7.1.6.4/10 段规定:

如果具有声明返回类型且使用占位符类型的函数没有 return 语句,则返回 类型是从 return 语句推导出来的,在函数的右大括号处没有操作数 身体。 [...]

这意味着在main() 中省略return 语句将使其类型为void

第 3.6.1/5 段引入的关于从main() 结尾流出的特殊规则指定:

[...] 如果控制到达终点 的main 没有遇到return 语句,效果就是执行

return 0;

措辞说,在程序执行期间的“效果”与return 0 存在一样,而不是return 语句将添加到程序中(这会影响根据引用段落的类型推导)。

编辑:

为此有一个Defect Report (courtesy of Johannes Schaub):

提议的决议(2013 年 11 月):

将3.6.1 [basic.start.main]第2段修改如下:

实现不应预定义主要功能。该功能不得重载。它应该有一个int类型的声明的返回类型,否则它的类型是实现定义的。 所有实现 一个实现应允许两者

  • () 的函数返回 int
  • int,指向指向char的指针的指针)的函数返回int

作为类型...

【讨论】:

  • 但是将返回类型推断为int 是“执行return 0; 的效果”吗?
  • @BenVoigt:嗯,效果不是“添加return 0”,并且 7.1.6.4/10 指定“如果具有声明返回类型且使用占位符类型的函数没有返回语句 [...]”。从main 的末尾流出并没有添加return 语句,因此应适用该句的其余部分,并且应推断返回类型为void
  • 你是说“执行的效果”意味着没有编译时效果发生吗?这种概念上的区别真的存在吗?我很难相信这一点。
  • 啊,我明白了。我想它可以这样阅读。但尽管如此,一些 clang 开发人员发布了一份关于此的问题报告,以澄清此处的规范。
  • 根据关于核心反射器的讨论,即使main 包含返回intreturn-statement,这也是不允许的。 main 实际上是在运行时重新声明一个实体,它的 declared 返回类型必须与该实体匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2020-02-19
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
相关资源
最近更新 更多