我能够找到的关于main()
[3.6.1]的C ++ 14的最后一个草案:
实现不应预定义主函数。此功能不应过载。它应该具有int类型的返回类型,否则其类型是实现定义的。所有实现都应允许两者
- ()返回int和
的函数- 返回int
的函数(int,指向char的指针)
和(第5段)
如果控件到达main的末尾而没有遇到return语句,则效果是执行
return 0;
这是否意味着以下所有内容都是合法的C ++ 14最小程序?如果没有,为什么不呢?
auto main() -> int {}
auto main() { return 0; }
auto main() {}
答案 0 :(得分:17)
合法,第二个和后者不是由于以下原因:
由于接受了CWG 1669,因此无法推断出主要功能的返回类型,标准将改写为:
实现不应预定义主函数。此功能不应过载。它应具有类型为int的声明的返回类型,否则其类型是实现定义的。
这进入了n4140。更多相关信息:http://wg21.cmeerw.net/cwg/issue1669
与上述相同
答案 1 :(得分:1)
第一种可能是合法的。其他两个当然不是 (§7.1.6.4/ 1):“auto type-specifier表示类型 声明的变量应从其中推断出来 初始化器或函数声明器应包括的 尾随返回类型。“
我说可能是第一个,因为§3.6.1并不是很清楚
定义必须匹配的程度。 100%文字匹配
不是必需的,即使这是字面上的解释
它所说的意味着:在文中,main
的主体是
以/* ... */
给出,这不是很有用,当然也是
不是必需的。同样,传统也允许任何名称
对于argc
和argv
,并将argv
声明为char** argv
。
没有关于用尾随回报定义主要的传统
但是,类型。我认为§3.6.1中的含义是
所有具有相同签名的main
定义都是
允许,但这不是实际的话所说的。
无论如何:为什么会想要这样的混淆? C / C ++不是 帕斯卡,以及一种语言中的自然(如尾随 函数的返回类型)是另一个的混淆。
编辑:
我刚刚下载了一个更新的草稿(N3797),看来
就像措辞已经改变(现在是矛盾的)。该
第一段仍然说基本相同的事情(但是
包括lambdas的附加措辞):auto
是
取而代之的是“通过从初始化程序中扣除或通过显式化
具有尾随返回类型的规范。“(当然,
fucntions没有初始化器,所以只有
trailing-return-type可以应用。)但是,后面的段落可以
谈论从退货类型中扣除,即使是
第一段需要尾随返回类型(因此
使演绎多余)。