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

时间:2013-11-20 07:15:48

标签: c++ c++14

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

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

auto && v = func();

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

1 个答案:

答案 0 :(得分:5)

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

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

即使应用,复制省略也不会删除复制或移动返回对象 的要求。 decltype(auto)无法从函数返回初始化非可移动类型的对象,而auto &&可以使用本地生存期模拟本地和临时之间的区别。

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