C++ 隐式返回0如何连接到main';s退货类型扣除?
N3936[basic.start.main]C++ 隐式返回0如何连接到main';s退货类型扣除?,c++,language-lawyer,c++14,C++,Language Lawyer,C++14,N3936[basic.start.main] 2实现不应预定义main功能。这 功能不应过载。它应具有声明的返回类型 类型为int,但其类型是实现定义的。一 实施应允许两种情况 -()返回int和 -函数(int,指针指向char)返回int 5main中的返回语句具有离开main的效果 功能(销毁任何具有自动存储持续时间的对象)和 使用返回值作为参数调用std::exit。如果控制 到达main的结尾时未遇到return语句 效果就是执行 return 0; 在措辞中添加了单词declar
2
实现不应预定义main
功能。这
功能不应过载。它应具有声明的返回类型
类型为int
,但其类型是实现定义的。一
实施应允许两种情况
-()
返回int
和
-函数(int
,指针指向char
)返回int
5
main中的返回语句具有离开main的效果
功能(销毁任何具有自动存储持续时间的对象)和
使用返回值作为参数调用std::exit
。如果控制
到达main的结尾时未遇到return语句
效果就是执行
return 0;
在措辞中添加了单词declared,这意味着如果要声明main
,auto
,则必须使用尾部返回类型。然而,正如上面引用的那样,引入的措辞表示“一个实现应同时允许…返回int
…”当涉及到main
的声明时,这种措辞要严格得多
因此,给定auto
的规则,是一个隐式返回0代码>足以使
auto main() { }
合法?在C++14中,auto main(){}
似乎不合法
[dcl.spec.auto]
2
占位符类型可以与函数声明符一起出现在
decl说明符seq、类型说明符seq、转换函数id或尾部返回类型,在使用此类声明符的任何上下文中
有效。如果函数声明符包含尾部返回类型
(8.3.5),指定函数的声明返回类型。如果
函数的声明返回类型包含占位符类型,
函数的返回类型由中的return
语句推导而来
函数体(如果有)
10
如果函数的声明返回类型使用占位符
类型没有return
语句,return
类型推断为
尽管来自一个返回语句,但在
功能体。[示例:
-[结束示例]
这似乎意味着,由于没有return
语句,main()
被推断为void
,因此程序的格式不正确。然而,它留下了一个歧义,似乎允许隐式返回0
推断为int
。哦,好吧。缺陷报告的重点是澄清标准的这一部分。询问DR前标准的含义是没有用的,因为委员会已经意识到该标准不够明确,并将对其进行更改。@SebastianRedl这些更改已经出现在N3936中,但是?正如@Sebastian所说,请记住,以后的缺陷报告纠正(感知)了标准中的缺陷(内容和/或演示文稿),或使其与新功能保持一致。或者,他们可能会引入新功能,但这里不是这种情况。因此,后来的DR会使其明确无误。@2PassissTillaLive我不确定您的意思。DR 1669及时将其放入C++14,这就是其状态被列为“C++14”的原因,不是吗?换句话说,C++14标准中有“声明”一词,并且auto main(){}
绝对不是有效的C++14。@hvd OK我现在明白了:(
auto f() { } // OK, return type is void
auto* g() { } // error, cannot deduce auto* from void()