【问题标题】:Problems with return type deduction for normal functions?正常函数的返回类型扣除问题?
【发布时间】:2013-08-03 16:41:45
【问题描述】:

在 Eric Niebler 的 Proto-0x 演讲的最后,有一个关于 C++1y 特性的讨论。在讨论return type deduction for normal functions 时,他说,(我想,使用当前的 C++1y 规范),他将无法对普通函数使用返回类型推导(这将允许他替换他的一些RETURN try_call聪明)。我希望我理解了这一点。如果我没有,请纠正我。

遗憾的是,视频中没有捕捉到这一断言背后的基本原理(我几乎听不到任何声音)。我能听到的唯一原因是函数没有被推断为noexcept。但似乎还有另一个更重要的原因。

有没有人知道原因或能够转录讨论内容?

【问题讨论】:

  • @NicolBolas 你可以返回一个std::function 存储一个lambda,但不是一个lambda。
  • @gnzlbg:你做到了。如果出于某种原因,Rapptz 会被删除。
  • @NicolBolas 演讲是关于 C++11,但演讲中的问题是关于对普通函数使用返回类型推导,这是 C++1y 的特性,不是吗?我几乎听不到视频的那部分内容。
  • @NicolBolas 在讨论中,他们也在讨论 c++1y(宽松的 constexpr 和返回类型推导)。他说他想对 C++1y 中的普通函数使用返回类型推导(以替换他的 RETURN try_call hacks)。由于视频质量我听不到的原因,他说(我想用当前的规格)他不能,而且大多数 boost 开发人员也不能。我的问题是,他为什么这么说?他们的理由是什么?当前规范有什么问题?
  • @NicolBolas:你对他所说的话的解释根本不合适。他说他将无法使用该功能,这非常可悲。有什么好伤心的?在其他人都可以使用之前,他将无法使用该功能?是的,他的代码是针对 C++11 编写的。但是当 C++1y 标准化后,他会针对它重写代码。

标签: c++ c++14


【解决方案1】:

如果不看视频(如果相关部分听不见,那么无论如何都没有意义!)我会冒险猜测问题在于返回类型推导不允许在返回类型中使用 SFINAE 技巧。 RETURNS 宏(来自 David Abrahams)的使用方式如下:


    template<typename T>
      auto foo( T&& t ) RETURNS( some-expression-using-t ); 

扩展至:


    template<typename T>
      auto foo( T&& t ) noexcept(noexcept( some-expression-using-t ))
      -> decltype( some-expression-using-t )
      { return some-expression-using-t; }

这会从表达式中推导出返回类型和异常规范,如果 <i>some-expression-using-t</i> 不是有效的表达式,SFINAE 还会导致函数从重载集中删除。

但是在 C++1y 中,像这样重写它以使用返回类型推导:


    template<typename T>
      decltype(auto) foo( T&& t )
      { return some-expression-using-t; }

您失去了自动异常规范和 SFINAE 行为。要恢复这些功能,您必须再次多次写出<i>some-expression-using-t</i> 部分(或使用宏),而不是使用(否则非常好)返回类型推导功能。

注意Concepts Lite 将为 SFINAE 功能提供更好的替代方案,但我们可能仍希望 noexcept(auto) 再次恢复自动异常规范行为。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2018-03-11
  • 2013-03-07
  • 2015-12-09
相关资源
最近更新 更多