如果不看视频(如果相关部分听不见,那么无论如何都没有意义!)我会冒险猜测问题是返回类型推导不允许在返回类型中使用 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)
再次恢复自动异常规范行为。