我的Herb Schildt关于C++的书说:"......在C++中,如果函数被声明为返回一个值,它必须返回一个值." 但是,如果我编写一个非void返回类型的函数并且不返回任何内容,则编译器会发出警告而不是错误:"控件到达非void函数的结尾".
我使用gcc(MinGW)并设置了-pedantic标志.
GMa*_*ckG 27
§6.6.3/ 2:
流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.
所以这取决于你对强制性的定义.你有吗?不.但是,如果您希望您的程序具有明确定义的行为,是的.*
*main是一个例外,见§3.6.1/ 5.如果控制到达main没有a 的结束return,它将具有的效果return 0;.
lio*_*ori 10
它是强制性的 - 当这样的函数结束而没有返回任何东西时它是一个未定义的行为(因此编译器实际上可能实现某种特殊行为).但是,有一些特殊情况.
::main是一个例外,假设它return 0;在代码的末尾.
此外,您不必在不能完全返回的函数中返回值,fe:
int Foo() {
throw 42;
}
Run Code Online (Sandbox Code Playgroud)
在声明为返回非void的函数中使用return语句并不是必须的,并且它不必导致未定义的行为.
这样的功能可以:
std::terminate当然,如果函数通过始终执行上述操作之一来避免未定义的行为,则可能不应将其声明为返回非void(如果可能).
需要的一个明显情况是,如果它是一个虚函数,对于类层次结构中的特定点,它不能返回有效值并始终通过异常退出.