在Eric Niebler的Proto-0x演讲结束时,讨论了 C ++ 1y 功能。在讨论return type deduction for normal functions时,他说,(根据当前的 C ++ 1y 规范,我认为),他将无法使用返回类型推导用于正常函数(这将是允许他替换他的一些RETURN try_call
聪明)。我希望我说得对。如果我没有,请纠正我。
可悲的是,这个断言背后的理由并未在视频中捕获(我几乎听不到任何声音)。我能够听到的唯一原因是函数不会推断为noexcept
。但似乎还有另一个更重要的原因。
有谁知道原因或能够转录讨论?
答案 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)
再次获得自动异常规范行为。