为什么 g++ 允许我将这个 void 函数视为任何东西

Why is g++ allowing me to treat this void-function as anything but?

本文关键字:函数 任何东 void g++ 允许我 为什么      更新时间:2023-10-16

为什么下面的编译在GCC 4.8(g++)中?是不是完全畸形了?

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

两者都应该从根本上是不可能的 - 不仅仅是UB,据我所知 - 使用void返回类型。

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

现场演示

这是

标准允许的(§6.6.3/3)

表达式类型为 void 的

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

至于为什么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

相关文章: