C++11:所有控制路径是否仍需要返回值?

4

这可能是一个很荒谬的问题,但我今天在C++中编写了一个成员函数,它应该返回一个整数,但并不总是如此。我甚至写了一个非常简单的函数,没有返回值...

int derp()
{
    if (11 == 22) return 0;
}

这是最近的变化吗?还是我的编译器坏了?哈哈

编辑:这确实可以编译


在x86上,返回值通常是eax寄存器所持有的值,这个值将取决于编译器在函数中如何选择使用它。因此,它的值/行为可能会因编译器而异,并随着编译设置的变化而不同,即未定义。至于您的代码,根据您如何使用此函数的返回值,编译器优化器可能会剥离并忽略它,因此您不会收到任何警告。 - James
“recent change”具体指什么意思? - Nikos C.
2个回答

7
在非void函数中,所有的控制路径都必须返回。这里的关键问题是编译器不需要进行诊断。请注意,编译正确并不一定相同。所有的正确的代码都可以编译,但并不是所有编译过的代码都是正确的

我看到了,我本以为这在编译之前会出现编译错误。 - David Carpenter
@DavidCarpenter:编译器可以(应该)诊断它,但这并非必需。 - David Rodríguez - dribeas
1
@DavidCarpenter 如果你使用GCC编译器并加上“-Wall”标志,你会得到一个警告。 - juanchopanza
@DavidCarpenter:确保你的警告级别适当高。 - GManNickG
1
你是否在考虑这段话:“函数没有返回值,程序跑到最后一个语句的时候自然退出,与在函数结尾处明确使用return退出的效果基本等价;但在具有返回值的函数中,流程结束时缺少了return语句执行返回操作,导致行为未定义。”(出现在6.6.3的某个地方)?只要程序在运行时不会真的发生这种情况,任何路径上都可以不返回任何内容。即使是主题帖中的示例也是可以接受的,只要函数没有被调用即可(这使其成为一种病态示例,我想)。 - Luc Danton

4
不,C++从未要求所有控制路径都返回值。在C++11和C++03中也是有效的(语法上)。一些编译器可以检测到大多数缺少返回值的情况,但不需要发出诊断。如果至少有一个控制路径返回,则大多数编译器不会发出诊断。但无论如何,这是未定义行为。

在这种情况下,返回值被认为是“未定义”的吗? - David Carpenter
2
@DavidCarpenter,调用一个返回值函数并且“流过末尾”的行为是未定义的。 - juanchopanza
我可能不小心碰到了它,抱歉。 - David Carpenter
@DavidCarpenter - 如果你不小心点击了它,你可以撤销它。 - Pete Becker
你说并非所有的控制路径都需要返回一个值,@David Rodríguez - dribeas则持相反观点,我想知道哪个是真的。 ;) - Skalli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接