C++14 中 main() 的法律定义[重复]

问题描述 投票:0回答:2

我能找到的 C++14 的最后一个草案说,关于

main()
[3.6.1]:

实现不应预定义主函数。该函数不得超载。它应具有 int 类型的返回类型,但除此之外,其类型是实现定义的。所有实现都应允许两者

— () 返回 int 的函数并且

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

和(第 5 段)

如果控制到达 main 末尾而没有遇到 return 语句,则效果是执行

return 0;

这是否意味着以下所有都是合法的 C++14 最小程序?如果没有,为什么不呢?

  1. auto main() -> int {}
  2. auto main() { return 0; }
  3. auto main() {}
c++ program-entry-point language-lawyer c++14
2个回答
18
投票
  1. 是合法的,第二个和后者则不合法,原因如下:

  2. 主函数的返回类型无法推断,因为 CWG 1669 已被接受,标准将改写为:

    实现不应预定义主函数。该函数不得超载。它应具有 int 类型的声明返回类型,但除此之外,其类型是实现定义的。

    n4140 也采用了这种方法。更多信息:http://wg21.cmeerw.net/cwg/issue1669

  3. 同上


1
投票

第一个可能是合法的。另外两个肯定不是 (§7.1.6.4/1):“auto 类型说明符表示该类型 被声明的变量的值应从它的 初始化程序或函数声明符应包含 尾随返回类型。”

我说可能是第一个,因为§3.6.1 不太清楚 定义必须匹配到什么程度。 100% 文本匹配 不是必需的,即使这是字面解释 它所说的含义是:在文本中,

main
的主体是 给出为
/* ... */
,这不是很有用,当然 不是必需的。同样,传统也允许任何名字 对于
argc
argv
,并将
argv
声明为
char** argv
。 没有使用尾随返回来定义 main 的传统 类型,但是。我认为第 3.6.1 节的意思是 具有相同签名的
main
的所有定义将是 允许,但这不是实际的说法。

无论如何:为什么人们想要这样的混淆呢? C/C++ 不是 Pascal,以及一种语言中自然的东西(比如尾随 函数的返回类型)是另一个混淆。

编辑:

我刚刚下载了最新的草稿(N3797),看起来 就像措辞已经改变(现在是矛盾的)。这 第一段仍然说基本上相同的事情(但是 包括 lambda 的附加措辞):

auto
是 替换为“通过从初始值设定项推导或显式 具有尾随返回类型的规范。”(当然, 函数没有初始化器,所以只有 尾随返回类型可以适用。)但是后面的段落确实如此 谈论从返回类型的推导,即使 第一段需要尾随返回类型(因此 使扣除变得多余)。

© www.soinside.com 2019 - 2024. All rights reserved.