main()在C ++中的法律定义14
我能找到的C ++ 14的最后一份草稿说,关于main()
[3.6.1]:
一个实现不应该预定义主函数。 该功能不得超载。 它应该有一个类型为int的返回类型,否则它的类型是实现定义的。 所有的实现应该允许两者
- ()返回int和的函数
- (int,指向指向char的指针)返回int的函数
和(第5段)
如果控制到达主的结尾而没有遇到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):“自动类型说明符表示被声明的变量的类型应从其初始值设定项中推导出来,或者函数声明符应包含尾随返回类型。”
我可能首先说,因为§3.6.1不清楚定义必须匹配的程度。 不需要100%的文本匹配,即使这是对它的含义的字面解释:在文本中, main
被赋予为/* ... */
,这不是非常有用,而且当然不是必需的。 同样,传统,也允许任何名称argc
和argv
,并宣布argv
作为char** argv
。 然而,没有关于用尾随返回类型定义main的传统。 我认为§3.6.1中的含义是所有具有相同签名的main
定义都将被允许,但这不是真正的单词所说的。
不管:为什么要这样混淆呢? C / C ++不是Pascal,一种语言的自然语言(如函数的尾随返回类型)在另一种语言中是混淆的。
编辑:
我刚刚下载了一份更新的草案(N3797),看起来措辞已经改变(现在是矛盾的)。 第一段还说基本上是一样的东西(但包括lambda表达式的添加词): auto
被替换为“从初始值设定项中扣除或通过带有尾部返回类型的显式指定项”。 (当然,函数没有初始值设定项,所以只能使用尾随返回类型。)然而,后面的段落会讲到从返回类型中扣除,即使第一段需要尾随返回类型(和从而使扣除是多余的)。