我发现以下代码被Visual C++ 2008和GCC 4.3编译器接受:
void foo()
{
}
void bar()
{
return foo();
}
Run Code Online (Sandbox Code Playgroud)
它编译时我有点惊讶.这是语言功能还是编译器中的错误?C/C++标准对此有何看法?
Cub*_*bbi 70
它是C++的语言特性
C++(ISO 14882:2003)6.6.3/3
表达式为"cv void"的return语句只能用于返回类型为cv void的函数; 在函数返回其调用者之前计算表达式.
C(ISO 9899:1999)6.8.6.4/1
带有表达式的return语句不应出现在返回类型为void的函数中.
zvr*_*rba 51
是的,它是有效的代码.当您具有模板功能以便可以使用统一代码时,这是必需的.例如,
template<typename T, typename P>
T f(int x, P y)
{
return g(x, y);
}
Run Code Online (Sandbox Code Playgroud)
现在,g当第二个参数是某种特定类型时,可能会重载以返回void.如果"返回void"无效,则调用f将会中断.
这是有效的,例如,在您希望在返回之前执行某些错误处理的情况下创建更清晰的代码非常有用:
void ErrRet(int code, char* msg)
{
// code logging/handling error
}
void f()
{
if (...) return ErrRet(5, "Error Message !");
// code continue
}
Run Code Online (Sandbox Code Playgroud)