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

What is the difference between returning auto&& and decltype(auto)?

我正在尝试制作模板包装函数,它应该转发参数和 return 值。而且我无法决定将 auto&&decltype(auto) 用于 return 类型哪个更好。我读过 Scott Meyers article 并了解到有必要 return decltype(auto)auto 相比,不要剥离 ref_qualifiers。 据我所知,同样的论点适用于使用 auto&& 而不是 auto。 现在我有以下问题:

  1. 我说的对吗,return 引用对象时 decltype(auto)auto&& 没有区别?
  2. 如果我们 return rvalue 对象会发生什么,例如:return int{};? return 值会是悬空引用吗?
  3. decltype(auto)auto&& 有什么区别?什么更适合 forward return 类型?

What is the difference between decltype(auto) and auto&&?

decltype(auto)涵盖三种情况。当 returning 左值时,return 类型将是 T&(左值引用);对于 xvalues,return 类型将是 T&&(右值引用);对于纯右值,return 类型将是 T(非引用,即按值 return)。

auto&&只涵盖两种情况。当 returning 左值时,return 类型将是 T&(左值引用);对于右值,包括 xvalues 和 prvalues,return 类型将是 T&&(右值引用)。 (Forwarding reference 始终是参考。)

What happens if we return rvalue object, like: return int{};? Will return value be dangling reference?

对于 auto&&,return 类型是右值引用,所以是的,returned 引用总是悬空的。对于 decltype(auto),return 类型是非引用,那么就没有这样的麻烦。