首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么g++允许我把这个虚空函数当作任何东西来对待?

为什么g++允许我把这个虚空函数当作任何东西来对待?
EN

Stack Overflow用户
提问于 2014-01-04 16:52:03
回答 2查看 420关注 0票数 8

为什么下面的编译在GCC 4.8 (g++)中?它不是完全不正常吗?

代码语言:javascript
运行
复制
void test(int x)
{
    return test(3);
}

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

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

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

现场演示

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-04 16:55:37

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

只有返回类型为cv的函数才能使用带空类型表达式的返回语句;表达式是在函数返回给调用方之前计算的。

票数 11
EN

Stack Overflow用户

发布于 2014-01-04 21:12:52

至于为什么GCC允许它-当然,因为标准要求它是有效的。构建标准中规则的传递闭包,我确信GCC允许这样做,因为它在模板的情况下是有用的

代码语言:javascript
运行
复制
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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20923800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档