我能找到的 C++14 的最后一个草案说,关于
main()
[3.6.1]:
实现不应预定义主函数。该函数不得超载。它应具有 int 类型的返回类型,但除此之外,其类型是实现定义的。所有实现都应允许两者
— () 返回 int 的函数并且
— (int, 指向 char 的指针) 返回 int 的函数
和(第 5 段)
如果控制到达 main 末尾而没有遇到 return 语句,则效果是执行
return 0;
这是否意味着以下所有都是合法的 C++14 最小程序?如果没有,为什么不呢?
auto main() -> int {}
auto main() { return 0; }
auto main() {}
是合法的,第二个和后者则不合法,原因如下:
主函数的返回类型无法推断,因为 CWG 1669 已被接受,标准将改写为:
实现不应预定义主函数。该函数不得超载。它应具有 int 类型的声明返回类型,但除此之外,其类型是实现定义的。
n4140 也采用了这种方法。更多信息:http://wg21.cmeerw.net/cwg/issue1669
同上
第一个可能是合法的。另外两个肯定不是 (§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
是
替换为“通过从初始值设定项推导或显式
具有尾随返回类型的规范。”(当然,
函数没有初始化器,所以只有
尾随返回类型可以适用。)但是后面的段落确实如此
谈论从返回类型的推导,即使
第一段需要尾随返回类型(因此
使扣除变得多余)。