C++14 中 main() 的合法定义
Posted
技术标签:
【中文标题】C++14 中 main() 的合法定义【英文标题】:Legal definitions of main() in C++14 【发布时间】:2014-12-15 17:54:19 【问题描述】:我能找到的 C++14 的最后一个草稿说,关于 main()
[3.6.1]:
实现不应预定义主要功能。该功能不得重载。它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。所有实现都应允许两者
— () 返回 int 和
的函数——(int,pointer to pointer to char)返回int的函数
和(第 5 段)
如果控制到达main末尾没有遇到return语句,效果就是执行
return 0;
这是否意味着以下所有的都是合法的 C++14 最小程序?如果没有,为什么不呢?
auto main() -> int
auto main() return 0;
auto main()
【问题讨论】:
最后一个是不合法的,因为auto
推导出返回类型为void
。见***.com/questions/17134975/…
@0x499602D2 第二个引号不是暗示返回类型应该推导出为int
用于案例3?
@TristanBrindle 链接中的答案说明了这一点。
出于好奇,既然int
是唯一合法的返回类型,为什么有人要为main()
函数返回auto
?那会给你带来什么?
@Void Nothing。我只是好奇这在技术上是否允许。
【参考方案1】:
合法,第二个和后一个不合法,原因如下:
由于接受了CWG 1669,因此无法推断主函数的返回类型,标准将改写为:
实现不应预定义主要功能。该功能不得重载。它应该有一个声明的 int 类型的返回类型,否则它的类型是实现定义的。
这进入了 n4140。更多信息:http://wg21.cmeerw.net/cwg/issue1669
同上
【讨论】:
永远不会推断出函数的返回类型(除了 lambda)。函数声明必须具有经典形式,返回类型在前面,或者是尾随返回类型。 @JamesKanze 对于 C++14 不再适用 我必须同意 Tristan:n4140 §7.1.6.4/p2:If the function declarator includes a trailing-return-type (8.3.5), that specifies the declared return type of the function. If the declared return type of the function contains a placeholder type, the return type of the function is deduced from return statements in the body of the function, if any.
@MarcoA 我仍然不相信为什么“return 0;
的效果”不包括对案例(3)的推导 int
,但是缺陷报告和随后的语言澄清让它没有实际意义。非常感谢:-)
@TristanBrindle 是正确的,对不起。我忽略了它。由于第 5 段,我相信它属于同一情况。无论如何,我同意某些部分仍然是“正在进行中的工作”,并且可能存在歧义。【参考方案2】:
第一个可能是合法的。其他两个肯定不是 (§7.1.6.4/1):“自动类型说明符表示类型 被声明的变量的数量应从其推导出来 初始化器或函数声明器应包括 尾随返回类型。”
我说的可能是第一个,因为 §3.6.1 并不是很清楚
定义必须匹配到什么程度。 100% 文本匹配
不是必需的,即使这是字面意思的解释
它所说的意思是:在文本中,main
的正文是
以/* ... */
给出,这不是很有用,当然
不是必需的。同样,传统也允许任何名称
对于argc
和argv
,并将argv
声明为char** argv
。
没有关于用尾随回报定义 main 的传统
类型,但是。我认为 §3.6.1 中的意思是
main
的所有具有相同签名的定义将是
允许,但这不是实际所说的。
无论如何:为什么要这样混淆? C/C++ 不是 帕斯卡,以及一种语言中自然的东西(如尾随 函数的返回类型)在另一个方面是混淆的。
编辑:
我刚刚下载了一份更新的草稿 (N3797),看起来
就像措辞已经改变(现在是矛盾的)。这
第一段仍然说基本相同的事情(但是
包括用于 lambdas 的附加措辞):auto
是
替换为“通过从初始化程序中推导或通过显式
带有尾随返回类型的规范。”(当然,
函数没有初始化器,所以只有
trailing-return-type 可以应用。)然而,后面的段落做
谈论从返回类型中扣除,即使
第一段需要尾随返回类型(因此
使扣除多余)。
【讨论】:
"不管怎样:为什么要这样混淆?"一个不会,我只是好奇:-)以上是关于C++14 中 main() 的合法定义的主要内容,如果未能解决你的问题,请参考以下文章