为什么下面的编译在GCC 4.8 (g++)中?它不是完全不正常吗?
void test(int x)
{
    return test(3);
}
int main() {}test的结果,它不存在test返回一个值从根本上来说,这两者都不可能--据我所知,不仅仅是UB --使用void返回类型。
我得到的唯一警告是x未使用,甚至没有添加任何非标准的隐式返回类型。
现场演示
发布于 2014-01-04 16:55:37
这是标准所允许的(第6.6.3/3节)
只有返回类型为cv的函数才能使用带空类型表达式的返回语句;表达式是在函数返回给调用方之前计算的。
发布于 2014-01-04 21:12:52
至于为什么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; });
}正如您所看到的,call不需要在return语句中为void做特例。这有点类似于x.~T()是如何允许的,即使T最终成为int。
https://stackoverflow.com/questions/20923800
复制相似问题