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



关于尾随返回类型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,因为没有替代品

最新更新