3

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

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

有谁知道原因或能够转录讨论?

4

1 回答 1

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; }

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

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


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

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

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

于 2013-09-21T12:41:52.467 回答