正常功能的退货类型扣除问题?

时间:2013-08-03 16:41:45

标签: c++ c++14

在Eric Niebler的Proto-0x演讲结束时,讨论了 C ++ 1y 功能。在讨论return type deduction for normal functions时,他说,(根据当前的 C ++ 1y 规范,我认为),他将无法使用返回类型推导用于正常函数(这将是允许他替换他的一些RETURN try_call 聪明)。我希望我说得对。如果我没有,请纠正我。

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

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

1 个答案:

答案 0 :(得分: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 ++中,我们重写它就像使用返回类型推导一样:


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

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

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