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

时间:2014-01-04 16:52:04

标签: c++ gcc c++11

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

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

int main() {}
  1. 我正在尝试使用调用test的结果,该结果不存在
  2. 我正在尝试从test
  3. 返回一个值

    根据void返回类型,两者都应该根本不可能 - 不仅仅是UB,而且只有UB。

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

    Live demo

2 个答案:

答案 0 :(得分:11)

标准允许(§6.6.3/ 3)

  

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

答案 1 :(得分: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; });
}

如您所见,call不需要在return语句中为void执行特殊情况。类似于x.~T()即使T最终为int的方式也是如此。