返回无效的有效代码?

Kar*_*nek 56 c c++

我发现以下代码被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的函数中.

  • 请注意,许多可以编译C和C++的编译器在编译C代码时会将C++规则作为非标准扩展提供,但如果您想要可移植,则不应该依赖它. (2认同)

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 positive_action(int n){if(n <0)return; 动作(N); [...]}`,如果`action`返回void,那么在`return`之后忘记分号将不会给出任何错误或警告,但是`action`现在被称为whe`n`是负数而不是正数. (3认同)

kof*_*fus 5

这是有效的,例如,在您希望在返回之前执行某些错误处理的情况下创建更清晰的代码非常有用:

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)