C++函数退出返回值

Returning a value on function exit in C++

在 C++ 中 main () 不需要包含 return 0; 是真的吗?

它仅适用于 main 还是适用于任何非空函数?

它是 C++11 中的新内容还是一直如此?

理由是什么?

Is it true that in C++ main () is not required to include a return 0;?

是的。

Does it apply to main only or to any non-void function?

仅适用于main()

Is it new in C++11 or was it always like that?

没有,一直都是这样。

What is the rationale?

最有可能的语言向后兼容性(以及与 C 的兼容性)。

[basic.start.main]/5(强调我的):

A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control flows off the end of the compound-statement of main, the effect is equivalent to a return with operand 0 (see also [except.handle]).

它似乎一直在 C++ 标准中(并且在 C 中,就此而言,从 C99 开始——参见 C99 规范 §5.1.2.2.3)。

仅适用于main()函数。

虽然我不知道原来的理由。它可能是“帮助开发人员避免在 main() 末尾键入 return 0;”。

如果您没有return 明确指定一个值,main() 函数保证为return 0。这是在 ISO 标准中定义的:

3.6.1/5: A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing

return 0;

此特殊行为仅适用于 main(),因为 main() 是一个函数 returning 一个 int,标准定义了一般规则:

6.6.3/2 Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

现在,它总是这样吗? C++ 编程语言 中的 Bjarne Stroutsturp 在 1986 年的版本中,早在任何标准化之前就提出了这一点。在他教程章节的大部分示例中,main() 不是 return 值,在早期版本的第 82 页上,他声明:

Conventionally, main() returns 0 if the program terminates normally and non zero otherwise, so returning the number of errors accomplishes this nicely

补充说明

然而,在本书中,规则隐含在示例和附带的解释中; Stroustrup 没有明确说明 main() 的一般明确规则,他也没有在 1994 年的 The Design and evolution of C++ 一书中提到它。

需要注意的是,在 C89 中,在没有显式 return 值的情况下,原则仍然是未定义的行为,直到 C99 到来。但在 C++98 中,当前的 0 return by default 规则已经正式化。所以我觉得不是为了向后兼容C.