首页 > 解决方案 > 返回类型的转发参考

问题描述

这两者有区别吗

struct S;
int& foo(S&);

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

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

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

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

解决方案


对于您的特定情况,它会产生相同的结果:两者的推导返回类型bar1()bar2()is int&

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

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


推荐阅读