【问题标题】:Forwarding reference for return type返回类型的转发参考
【发布时间】:2020-12-28 22:18:29
【问题描述】:

这两者有区别吗

struct S;
int& foo(S&);

auto&& bar1(S& s) {
    return foo(s);
}

decltype(auto) bar2(S& s) {
    return foo(s);
}

对于编译器?在这种情况下,我一直使用decltype(auto),但似乎auto&& 可以解决问题。是巧合还是两者都一样?

【问题讨论】:

  • bar的返回类型是从foo的返回类型推导出来的

标签: c++ c++14 forwarding-reference


【解决方案1】:

对于您的特定情况,结果相同:bar1()bar2() 的推导返回类型为 int&

但是,请注意,auto&& 始终会导致引用,即,bar1() 始终会返回引用,无论 foo() 是按值返回还是按引用返回。另一方面,如果foo(s) 按值返回(这不是您的情况),则将bar2() 返回的类型声明为decltype(auto) 将导致bar2() 返回按值

我猜你想完美转发foo(s)返回的对象。如果是这样,那实际上是decltype(auto) 的用例。想一想:如果foo() 是按值返回的,那么bar1() 的返回类型将被推导出为int&,即返回对临时对象的引用。

【讨论】:

  • 好的,现在我明白了。出于某种原因,我认为与转发/通用引用相同的机制可能会起作用。但这显然不在模板上下文中。愚蠢的问题。谢谢!
  • 返回类型auto&& 确实使用与转发引用函数参数相同的机制。两者都是引用 - 但引用返回类型比引用函数参数类型更危险。
猜你喜欢
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
相关资源
最近更新 更多