【问题标题】: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。
现在我有以下问题:
- 我说得对吗,当我们返回对对象的引用时,
decltype(auto) 和 auto&& 之间没有区别?
- 如果我们返回
rvalue 对象会发生什么,例如:return int{};?返回值会是悬空引用吗?
-
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),返回类型是非引用,那么就没有这样的麻烦了。