decltype(auto)vs auto &&对函数的返回类型执行通用处理

Gui*_*e07 6 c++ c++14

当使用auto&&处理函数返回一个左值:

int func()
{
   int v=42;
   return v;
}

auto && v = func();
Run Code Online (Sandbox Code Playgroud)

将其v视为左值而不是左值的后果是什么?这些后果是否证明使用decltype(auto)代替auto&&对函数的返回类型执行通用处理是合理的?

Pot*_*ter 6

auto&&对于捕获函数返回值来说,值已经是最优的,因此的差异decltype(auto)只能是不利的。在您的示例中,生命周期扩展应用于从该函数返回的其他临时对象。这导致它的行为与直接命名的对象基本相同,从而导致引用限定符被“擦除”。

使用decltype(auto)带有返回的值函数导致其返回值的对象被移动到本地。根据函数内部的内容,可能会应用复制省略,从而消除了本地和临时之间的区别。但这仅在某些情况下适用,而参考绑定的生存期延长是无条件的。

即使应用复制省略,也不能消除返回对象可以复制或移动的要求。decltype(auto)不能从函数返回中初始化不可移动类型的对象,而auto &&可以根据局部生存期对局部和临时之间的区别取模。

碰巧的是,只能通过进行区分decltype,并且只能通过在本地范围之外进行区分decltype(auto)。由于您通常希望将生命周期延长的对象视为本地对象,因此std::decay在使用时最好注意括号和s decltype,而不要decltype(auto)用于函数参数(这是的最常见的用法auto &&)。