关于尾随返回类型、返回类型推导和非常有用的问题和答案有很多很多。但是我没有找到关于是否需要尾随返回类型的答案,因为我们有. 是否存在尾随返回类型可以解决的情况,其中要么无法使用或不起作用(给出意外/不正确的结果)并且首先需要尾随返回类型?auto
decltype(auto)
decltype(auto)
decltype(auto)
问问题
319 次
2 回答
6
一个简单的例子是当你想在定义和推导返回类型之前调用函数:
decltype(auto) bar(); // doesn't help
decltype(auto) foo() { bar(); } // error: returned type of `bar` is unknown
decltype(auto) bar() { foo(); }
于 2019-09-19T10:27:54.387 回答
5
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,因为没有替代。
于 2019-09-19T12:23:24.763 回答