C++ 隐式返回0如何连接到main';s退货类型扣除?

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

N3936[basic.start.main]

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()