3

关于尾随返回类型、返回类型推导和非常有用问题和答案有很多很多。但是我没有找到关于是否需要尾随返回类型的答案因为我们有. 是否存在尾随返回类型可以解决的情况,其中要么无法使用或不起作用(给出意外/不正确的结果)并且首先需要尾随返回类型?autodecltype(auto)decltype(auto)decltype(auto)

4

2 回答 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 回答