返回 auto&& 和 decltype(auto) 有什么区别?

mou*_*_00 11 c++ return-type c++14 forwarding-reference decltype-auto

我正在尝试制作模板包装函数,该函数应该转发参数并返回值。我无法决定使用什么auto&&decltype(auto)返回类型更好。我读过 Scott Meyers 的文章,并理解与不剥离 ref_qualifiersdecltype(auto)相比,有必要返回。auto据我了解,同样的论点适用于使用auto&&over auto。现在我有以下问题:

  1. 我对吗,我们返回对象的引用之间decltype(auto)和何时没有区别?auto&&
  2. 如果我们返回对象,会发生什么rvalue,例如:return int{};?返回值会是悬空引用吗?
  3. decltype(auto)和 和有什么区别auto&&?什么更适合作为远期回报类型?

son*_*yao 19

decltype(auto)和 和有什么区别auto&&

decltype(auto)涵盖三种情况。返回左值时,返回类型为T&(lvalue-reference);对于 xvalues,返回类型为T&&(rvalue-reference);对于纯右值,返回类型为T(非引用,即按值返回)。

auto&&仅涵盖两种情况。返回左值时,返回类型为T&(lvalue-reference);对于右值,包括 xvalue 和纯右值,返回类型为T&&(rvalue-reference)。(转发参考始终是参考。)

如果我们返回右值对象会发生什么,例如:return int{};?返回值会是悬空引用吗?

由于auto&&返回类型是右值引用,所以返回的引用始终是悬空的。对于decltype(auto)返回类型是非引用的则没有这样的麻烦。