7

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

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

1 回答 1

11

decltype(auto)和 和有什么不一样auto&&

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

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

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

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

于 2021-09-26T13:56:59.793 回答