为什么g ++允许我将这个void-function视为什么呢?

Lig*_*ica 8 c++ gcc c++11

为什么以下在GCC 4.8(g++)中编译?它不是完全不合格吗?

void test(int x)
{
    return test(3);
}

int main() {}
Run Code Online (Sandbox Code Playgroud)
  1. 我正在尝试使用test不存在的调用结果
  2. 我正试图从中返回一个值 test

从根本上说,两者都应该是根本不可能的 - 不仅仅是UB,我还记得 - void返回类型.

我得到的唯一警告是关于x未使用,甚至没有关于添加非标准隐式返回类型的任何事情.

现场演示

Mat*_*Mat 11

这是标准所允许的(§6.6.3/ 3)

表达式为void的return语句只能在返回类型为cv void的函数中使用; 在函数返回其调用者之前计算表达式.

  • @LightnessRacesinOrbit:我猜它在返回类型可能是也可能不是"void"的模板中很有用. (2认同)
  • 它可以有它的用途.给定一个函数`void error_reporter(...)`,你可以在一个返回`void`的函数中编写代码:`if(something> sommat_else)返回error_reporter("不可能发生");`而不是需要大括号和其中有多个陈述.这可能非常有用. (2认同)

Joh*_*itb 6

至于为什么GCC允许它 - 确定因为标准要求它有效.根据标准中规则的基本原理构建传递闭包,我很确定GCC允许这样做,因为它在模板的情况下很有用

template<typename F>
typename std::result_of<F()>::type call(F f) {
  return f();
}

int main() {
   std::cout << call([]{ return 42; }) << std::endl;
   call([]{ std::cout << "I'm just an outputtor!" << std::endl; });
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在return语句中call不需要做特殊情况void.类似于x.~T()允许的类型,即使T最终结果为int.