N3936 [basic.start.main]
2
实现不应预定义main
函数。这个 功能不得超载。它应具有声明的返回类型 类型int
,但其类型是实现定义的。一个 实施应允许两者-
的函数()
返回int
和- 返回
的函数(int
char
,指向int
的指针)
5
main
中的返回语句具有离开主要的效果 功能(销毁具有自动存储持续时间的任何对象)和 以返回值作为参数调用std::exit
。如果控制 在没有遇到return语句的情况下到达main的末尾 效果是执行return 0;
DR 1669在措辞中添加了声明这个词,暗示如果main
被声明为auto
,则需要尾随返回类型。但是,DR 1003引入的措辞,如上面的引文所述,“一个实现应该允许......返回int
...的功能”这个措辞不那么严格它涉及main
的声明应该是什么样的。
因此,根据auto
的规则,隐含的return 0;
足以构成
auto main() { }
合法?
答案 0 :(得分:0)
{+ 1}}似乎在C ++ 14中不合法。
[dcl.spec.auto]
auto main() { }
占位符类型可以带有函数声明符 decl-specifier-seq , type-specifier-seq , conversion-function-id 或 trailing-return-type ,在任何这种声明者的上下文中 有效。如果函数声明符包含 trailing-return-type (8.3.5),指定函数的声明返回类型。如果 函数的声明返回类型包含占位符类型, 函数的返回类型是从2
语句中推导出来的 功能的主体,如果有的话。
return
如果具有声明的返回类型的函数使用占位符 type没有10
语句,return
类型被推导为 虽然来自一个返回语句,但在结束括号中没有操作数 功能体。 [示例:return
- 结束示例]
这似乎意味着由于没有auto f() { } // OK, return type is void
auto* g() { } // error, cannot deduce auto* from void()
个陈述,return
被推断为main()
,因此该程序格式不正确。然而,它留下了一个模棱两可的开放,似乎允许将隐式void
推导为return 0
。哦,好吧。