关于尾随返回类型、auto
返回类型推导和非常有用的decltype(auto)
,已经有很多很多问题和答案。但是我找不到是否需要尾随返回类型的答案,因为我们有decltype(auto)
.是否存在尾随返回类型解决的情况,其中decltype(auto)
无法使用或不起作用(给出意外/不正确的结果(,并且首先需要尾随返回类型?
一个简单的例子是,在定义函数并推导出返回类型之前,你想调用函数:
decltype(auto) bar(); // doesn't help
decltype(auto) foo() { bar(); } // error: returned type of `bar` is unknown
decltype(auto) bar() { foo(); }
decltype(auto)
(以及更普遍的推导返回类型(和尾随返回类型是正交特征。
您可以拥有:
decltype(auto) f() {}
auto f() -> decltype(auto) {}
尾随返回类型
尾随返回类型很好,特别是可以访问我们在函数名称之前没有的上下文
-
至于模板:
template <typename T> auto f(T x) -> decltype(bar(x));
对
template <typename T> decltype(bar(std::declval<T&>())) f(T x);
-
或对于类中的从属名称:
auto C::begin() -> iterator;
对
C::iterator C::begin();
唯一需要它的地方是 lambda(如果您有/想要显式指定返回类型(:
[]() -> some_type {/*...*/}
[]() -> auto {/*...*/}
(相当于[]() {/*...*/}
([]() -> decltype(auto) {/*...*/}
我们必须定义 lambda 的返回类型的情况是它应该返回引用类型。
推导的返回类型
用decltype(auto)
和auto
完成.
decltype(auto)
和auto
演绎类型不同,主要表现为T&&
和T
。
推导的返回类型需要定义主体。
他们也不允许SFINAE,因为没有替代品。