隐式返回 0 如何与主的返回类型扣除相关联?

How does implicit return 0 tie into main's return type deduction?

本文关键字:返回类型 关联 返回      更新时间:2023-10-16

N3936 [basic.start.main]

2 实现不应预定义main函数。这 功能不得过载。它应具有声明的返回类型 类型为 int ,但除此之外,其类型是实现定义的。一 实施应允许两者

()返回int

— (int 的函数,指针指向指向char的指针(返回int

5 main 中的 return 语句具有离开主语句的效果 功能(销毁具有自动存储持续时间的任何对象(和 使用返回值作为参数调用std::exit。如果控制 到达主的末尾而不遇到返回语句, 效果是执行的效果

return 0;

DR 1669在措辞中添加了声明一词,暗示如果要声明main auto,则需要尾随返回类型。然而,DR 1003引入的措辞说,如上面的引文所示,"实现应允许两个功能......返回int..." 当涉及到main声明应该是什么样子时,这种措辞就不那么严格了。

所以,给定auto规则,是一个隐含的return 0;足以使

auto main() { }

法律?

看来

auto main() { }在 C++14 中是不合法的。

[dcl.spec.auto]

2 占位符类型可以与函数声明符一起出现在 decl-specifier-seq、type-specifier-seqconvert-function-id尾随返回类型,在此类声明符为 有效。如果函数声明符包含尾随返回类型 (8.3.5(,指定函数的声明返回类型。如果 函数的声明返回类型包含一个占位符类型, 函数的返回类型是从 中的return语句推导出来的 函数的主体(如果有(。

10 如果函数具有使用占位符的声明返回类型 类型没有return语句,return类型推导为 虽然来自在右大括号处没有操作数的返回语句 函数体。[ 示例:

auto  f() { } // OK, return type is void
auto* g() { } // error, cannot deduce auto* from void()

结束示例 ]

这似乎意味着由于没有return语句,因此main()被推断为void,因此程序格式不正确。然而,它留下了一个模棱两可的地方,似乎允许将隐含return 0推断为int。哦,好吧。