decltype(auto) 是否使尾随 return 类型过时?

Does decltype(auto) make trailing return type obsolete?

关于尾随return类型auto return类型推导和非常有用 decltype(auto)。但是我没有找到是否需要 尾随 return 类型 的答案 完全 因为我们有 decltype(auto)。是否存在尾随 return 类型解决的情况,其中 decltype(auto) 无法使用或不起作用(给出意外/不正确的结果) 尾随 return 首先需要类型?

这个简单的例子是当你想在函数被定义和返回类型被推导之前调用它的情况:

decltype(auto) bar(); // doesn't help

decltype(auto) foo() { bar(); } // error: returned type of `bar` is unknown

decltype(auto) bar() { foo(); }

decltype(auto)(更普遍地推导出 return 类型)和尾部 return 类型是正交特征。

您可以拥有:

  • decltype(auto) f() {}
  • auto f() -> decltype(auto) {}

尾随 return 类型

尾随 return 类型很好,特别是可以访问我们在函数名称之前没有的上下文

  • 关于模板:

    template <typename T>
    auto f(T x) -> decltype(bar(x));
    

    对比

    template <typename T>
    decltype(bar(std::declval<T&>())) f(T x);
    
  • 或 class 中的依赖名称:

    auto C::begin() -> iterator;
    

    对比

    C::iterator C::begin();
    

唯一需要它的地方是 lambda(如果您 have/want 明确指定 return 类型):

  • []() -> some_type {/*...*/}
  • []() -> auto {/*...*/}(相当于[]() {/*...*/}
  • []() -> decltype(auto) {/*...*/}

我们必须定义 return lambda 类型的情况是它应该 return 引用类型的情况。

推导return类型

完成 decltype(auto)auto

decltype(auto)auto推导类型不同,主要是T&&T

推导的return类型需要主体的定义。

他们也不允许 SFINAE,因为没有替换