从函数返回时auto和decltype(auto)有什么区别?

tem*_*boy 42 c++ c++14

我很少看到,decltype(auto)但是当我这样做时,它会让我感到困惑,因为它似乎与auto从函数返回时一样.

auto g() { return expr; }
decltype(auto) g() { return expr; }
Run Code Online (Sandbox Code Playgroud)

这两种语法有什么区别?

Ker*_* SB 45

auto遵循模板参数推导规则,并且始终是对象类型; decltype(auto)遵循decltype基于值类别推断引用类型的规则.所以,如果我们有

int x;
int && f();
Run Code Online (Sandbox Code Playgroud)

然后

expression    auto       decltype(auto)
----------------------------------------
10            int        int
x             int        int
(x)           int        int &
f()           int        int &&
Run Code Online (Sandbox Code Playgroud)

  • 但是如果我执行`auto&& x = 5`,那么它会是`int&&`,但是如果我执行`decltype(auto) x = 5`,它仍然会是`int&&`。 (2认同)
  • @templateboy:不,后者只是`int`.只有xvalues成为右值引用. (2认同)
  • @templateboy:如果你只是声明一个变量,`auto`会更有用(例如,如果你有'auto &&`用于通用引用).当你主要想要用*类型*(而不是变量)操作时,`decltype`是有用的,例如在检查某个表达式是否具有某种类型的特征中. (2认同)
  • `decltype(auto)` 是否也保持 cv 资格? (2认同)
  • @templateboy:是的,它总是表达式的类型,可能添加了引用.如果表达式是CV限定值,则保留该值.有关详细信息,请参见7.1.6.2/4([dcl.type.simple]). (2认同)
  • 如果`f()`返回一个int怎么办?`decltype((f(x)))`返回`int &&`? (2认同)
  • @soandos:不,那就是`int`.只有xvalues而不是prvalues才会成为右值引用. (2认同)
  • @Zingam:当您想要返回纯右值时使用“auto”,当您想要转发返回的表达式并保留其值类别时使用“decltype(auto)”。后者更加微妙,需要仔细考虑,并且通常仅出现在通用代码中。前者可以合理地用在叶代码中。 (2认同)

Yak*_*ont 10

auto返回将return子句分配给auto变量所推导出的值类型. decltype(auto)返回包含return子句时将获得的类型decltype.

auto按值返回,decltype也许不是.