8

用于auto&&处理返回左值的函数时:

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

auto && v = func();

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

4

1 回答 1

9

auto&&已经是捕获函数返回值的最佳选择,因此 的差异decltype(auto)只能是缺点。在您的示例中,生命周期延长应用于从函数返回的其他临时对象。这导致它的行为本质上与直接命名的对象相同,其效果是引用限定符被“擦除”。

与按值返回函数一起使用decltype(auto)会导致其返回值对象移动到本地。根据函数内部的内容,可能会应用复制省略,从而消除本地和临时之间的区别。但这仅适用于有时,而引用绑定的生命周期延长是无条件的。

即使在应用时,复制省略也不会消除返回对象可以被复制或移动的要求。decltype(auto)无法从函数返回中初始化不可移动类型的对象,而auto &&可以将本地和临时之间的区别与本地的生命周期进行模数。

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

于 2013-11-20T10:08:09.117 回答