使用auto&&
处理返回左值的函数时:
int func()
{
int v=42;
return v;
}
auto && v = func();
将v
作为参考而不是左值的后果是什么?这些后果是否可以证明使用decltype(auto)
代替auto&&
来执行函数返回类型的泛型处理?
答案 0 :(得分:5)
auto&&
已经是捕获函数返回值的最佳选择,因此decltype(auto)
的差异只能是缺点。在您的示例中,生命周期扩展应用于从函数返回的其他临时对象。这使得它的行为与直接命名的对象基本相同,其效果是参考限定符被“擦除”。
使用decltype(auto)
和value-value函数会使其返回值对象移动到本地。根据函数内部的内容,可以应用复制省略,从而消除本地和临时之间的区别。但这仅适用于有时,而引用限制的生命周期延长是无条件的。
即使应用,复制省略也不会删除复制或移动返回对象 的要求。 decltype(auto)
无法从函数返回初始化非可移动类型的对象,而auto &&
可以使用本地生存期模拟本地和临时之间的区别。
实际上,这种区别只能由decltype
进行,并且只能由decltype(auto)
在本地范围之外进行。由于您通常希望将生命周期扩展对象视为本地人,因此最好在使用std::decay
时注意括号和decltype
,而不要使用decltype(auto)
对于函数参数(这是auto &&
)的最常见应用。