这两者之间有什么区别吗?
struct S;
int& foo(S&);
auto&& bar1(S& s) {
return foo(s);
}
decltype(auto) bar2(S& s) {
return foo(s);
}
对于编译器来说?我一直在像这种情况下使用decltype(auto)
,但是看起来auto&&
也可以完成任务。这是巧合还是两者相同?
这两者之间有什么区别吗?
struct S;
int& foo(S&);
auto&& bar1(S& s) {
return foo(s);
}
decltype(auto) bar2(S& s) {
return foo(s);
}
对于编译器来说?我一直在像这种情况下使用decltype(auto)
,但是看起来auto&&
也可以完成任务。这是巧合还是两者相同?
foo()
是返回值还是返回引用,bar1()
和 bar2()
的推导返回类型都是 int&
。auto&&
总是会得到一个引用,也就是说,bar1()
无论 foo()
返回值还是返回引用,它始终将以引用的方式返回。另一方面,将 bar2()
的返回类型声明为 decltype(auto)
将导致在 foo(s)
返回值的情况下(这不是您的情况),bar2()
以值的方式返回。foo(s)
返回的对象。如果是这样,那么实际上这正是 decltype(auto)
的用例。想一想:如果 foo()
返回值,那么 bar1()
的返回类型将被推断为 int&
,即返回一个临时对象的引用。auto&&
使用与转发引用函数参数相同的机制。两者都是引用 - 但引用返回类型比引用函数参数类型更危险。 - aschepler
bar
的返回类型是从foo
的返回类型推断出来的。 - 463035818_is_not_a_number