正如预期的那样,编译器(VisualStudio 2008)将发出警告
警告C4715:'doSomethingWith':不是 所有控制路径都返回一个值
编译以下代码时:
int doSomethingWith(int value)
{
int returnValue = 3;
bool condition = false;
if(condition)
// returnValue += value; // DOH
return returnValue;
}
int main(int argc, char* argv[])
{
int foo = 10;
int result = doSomethingWith(foo);
return 0;
}
但程序运行得很好。函数doSomethingWith()的返回值为0。
是仅仅是未定义的行为,还是存在一定的规则如何在运行时创建/计算结果值。非POD数据类型作为返回值会发生什么?
答案 0 :(得分:17)
它是ISO C ++标准6.6.3节中指定的未定义行为:
离开函数的末尾是 相当于没有价值的回报; 这会导致未定义的行为 价值回归功能。
答案 1 :(得分:7)
对于x86处理器,标准调用约定将返回值放入EAX寄存器。实际上,这意味着对于大多数编译器,如果我们到达函数的末尾而不返回,则将返回最后一个数学运算的结果。但是,你不能依赖它而且它不便携。
答案 2 :(得分:2)
不从值返回函数返回值会导致未定义的行为。
答案 3 :(得分:2)
更新@piotr回答。
来自C++17 Standard第9.6.3节
在构造函数,析构函数或函数的末尾流动 cv void返回类型等同于没有操作数的返回。 否则,流出除main之外的函数的末尾(6.6.1) 导致未定义的行为。