C ++中main()的法律定义14

时间:2014-10-20 16:54:39

标签: c++ main language-lawyer c++14

我能够找到的关于main() [3.6.1]的C ++ 14的最后一个草案:

  

实现不应预定义主函数。此功能不应过载。它应该具有int类型的返回类型,否则其类型是实现定义的。所有实现都应允许两者

     

- ()返回int和

的函数      

- 返回int

的函数(int,指向char的指针)

和(第5段)

  

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

     

return 0;

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

  1. auto main() -> int {}
  2. auto main() { return 0; }
  3. auto main() {}

2 个答案:

答案 0 :(得分:17)

  1. 合法,第二个和后者不是由于以下原因:

  2. 由于接受了CWG 1669,因此无法推断出主要功能的返回类型,标准将改写为:

      

    实现不应预定义主函数。此功能不应过载。它应具有类型为int的声明的返回类型,否则其类型是实现定义的。

    这进入了n4140。更多相关信息:http://wg21.cmeerw.net/cwg/issue1669

  3. 与上述相同

答案 1 :(得分:1)

第一种可能是合法的。其他两个当然不是 (§7.1.6.4/ 1):“auto type-specifier表示类型 声明的变量应从其中推断出来 初始化器或函数声明器应包括的 尾随返回类型。“

我说可能是第一个,因为§3.6.1并不是很清楚 定义必须匹配的程度。 100%文字匹配 不是必需的,即使这是字面上的解释 它所说的意味着:在文中,main的主体是 以/* ... */给出,这不是很有用,当然也是 不是必需的。同样,传统也允许任何名称 对于argcargv,并将argv声明为char** argv。 没有关于用尾随回报定义主要的传统 但是,类型。我认为§3.6.1中的含义是 所有具有相同签名的main定义都是 允许,但这不是实际的话所说的。

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

编辑:

我刚刚下载了一个更新的草稿(N3797),看来 就像措辞已经改变(现在是矛盾的)。该 第一段仍然说基本相同的事情(但是 包括lambdas的附加措辞):auto是 取而代之的是“通过从初始化程序中扣除或通过显式化 具有尾随返回类型的规范。“(当然, fucntions没有初始化器,所以只有 trailing-return-type可以应用。)但是,后面的段落可以 谈论从退货类型中扣除,即使是 第一段需要尾随返回类型(因此 使演绎多余)。