返回无效的有效代码?

我发现以下代码被Visual C ++ 2008和GCC 4.3编译器接受:

void foo() { } void bar() { return foo(); } 

编译我有点惊讶。 这是一个语言function还是在编译器中的错误? C / C ++标准对此有何评论?

这是C ++的一种语言function

C ++(ISO 14882:2003)6.6.3 / 3

带有“cv void”types的expression式的return语句只能用于具有cv void返回types的函数; expression式在函数返回给调用者之前被评估。

C(ISO 9899:1999)6.8.6.4/1

带有expression式的return语句不应出现在返回types为void的函数中。

是的,这是有效的代码。 当您有模板function时,这是必要的,以便您可以使用统一的代码。 例如,

 template<typename T, typename P> T f(int x, P y) { return g(x, y); } 

现在,当第二个参数是某种特定的types时, g可能被重载以返回void。 如果“返回无效”无效,则对f的呼叫就会中断。

这是有效的,例如,在返回之前要进行一些error handling的情况下创build更干净的代码是非常有用的:

 void ErrRet(int code, char* msg) { // code logging/handling error } void f() { if (...) return ErrRet(5, "Error Message !"); // code continue } 

确实有效。 我经常使用它来inputvalidationmacros:

 #define ASSERT_AND_RETURN_IF_NULL(p,r) if (!p) { assert(p && "#p must not be null"); return r; } bool func1(void* p) { ASSERT_AND_RETURN_IF_NULL(p, false); ... } void func2(void* p) { ASSERT_AND_RETURN_IF_NULL(p, void()); ... }