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

Fur*_*ish 3 c++ trailing-return-type c++17 c++20 decltype-auto

已经有很多很多很多关于这些问题和答案尾随返回类型auto返回类型推演和非常有益的decltype(auto)。但我没能找到答案是否尾随返回类型,需要在所有的,因为我们有decltype(auto)。是否存在尾迹返回类型可以解决的情况,decltype(auto)要么无法使用,要么不起作用(给出意外的/错误的结果),并且首先需要尾迹返回类型?

use*_*670 6

当您想在定义函数并推导返回类型之前调用函数时,一个简单的例子就是这样:

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

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

decltype(auto) bar() { foo(); }
Run Code Online (Sandbox Code Playgroud)

  • @Fureeish与`decltype(auto)`和尾随返回类型相反是错误的。在很多情况下,推导的返回类型将不起作用,而需要显式的返回类型,但是在任何情况下,都不需要显式的返回类型进行尾随(尽管使用尾随的返回类型可能会简化事情)。另请注意,`decltype(auto)`也可以是尾随返回类型。 (3认同)
  • @VTT如果您的返回类型取决于涉及函数参数的某些表达式的类型,该怎么办?它不包含单个简单的“ return”。或者,如果您想要SFINAE? (3认同)

Jar*_*d42 5

decltype(auto) (以及更一般的推论返回类型)和尾随返回类型是正交特征。

你可以有:

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

尾随返回类型

尾随的返回类型很好,尤其是要访问函数名称之前没有的上下文

唯一需要它的地方是lambda(如果您有/想要明确指定返回类型):

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

当我们必须定义lambda的返回类型时,就是应该返回引用类型的情况。

推导返回类型

decltype(auto)和完成auto

decltype(auto)auto演绎类型不同,主要是T&&T

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

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

  • @Fureeish:我发现了一种需要尾随返回类型的情况:lambda,因为我们以前没有这种类型。但同样与扣减返回类型无关。 (2认同)
  • @Fureeish:“ *绝对没有必须使用尾随返回类型的情况,正确的*”在Lambda之外,C ++中从未有过“绝对必须使用尾随返回类型”的情况。它始终是一项便利功能,用于减少重复并使代码更清晰。 (2认同)