【问题标题】:What is the difference between returning auto&& and decltype(auto)?返回 auto&& 和 decltype(auto) 有什么区别?
【发布时间】:2021-11-18 22:43:42
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c++14 return-type forwarding-reference decltype-auto


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2017-03-18
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      相关资源
      最近更新 更多