转发引用(Forwarding reference)作为返回类型

4

这两者之间有什么区别吗?

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 的返回类型推断出来的。 - 463035818_is_not_a_number
1个回答

7
对于您的特定情况而言,结果是相同的:无论 foo() 是返回值还是返回引用,bar1()bar2() 的推导返回类型都是 int&
但请注意,auto&& 总是会得到一个引用,也就是说,bar1() 无论 foo() 返回值还是返回引用,它始终将以引用的方式返回。另一方面,将 bar2() 的返回类型声明为 decltype(auto) 将导致在 foo(s) 返回值的情况下(这不是您的情况),bar2() 以值的方式返回。
我猜您想要完美地转发由 foo(s) 返回的对象。如果是这样,那么实际上这正是 decltype(auto) 的用例。想一想:如果 foo() 返回值,那么 bar1() 的返回类型将被推断为 int&,即返回一个临时对象的引用。

好的,现在我明白了。由于某种原因,我认为可能会出现与转发/通用引用相同的机制。但显然不是在模板上下文中。愚蠢的问题。谢谢! - Dawid
返回类型 auto&& 使用与转发引用函数参数相同的机制。两者都是引用 - 但引用返回类型比引用函数参数类型更危险。 - aschepler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接