[英]auto return type not deducing reference
我有以下代码:
#include <iostream>
struct C {
int a;
int& get() { return a; }
};
struct D {
int a;
int get() { return a; }
};
template <typename T>
auto foo(T o) { // no sample code is complete without a foo
return o.get();
}
int main()
{
C c;
D d;
c.a = 2;
d.a = 42; // no sample code is complete without a 42
std::cout << "c=" << c.a << ", d=" << d.a << "\n";
c.get() = 3;
//d.get() = 43;
std::cout << "c=" << c.a << ", d=" << d.a << "\n";
foo(c) = 4; // <--- why won't this work?
//foo(d) = 44;
std::cout << "c=" << c.a << ", d=" << d.a << "\n";
}
为什么标记的行不会编译? 似乎copiler正在推断foo<C>
的返回类型是int
而不是int&
I期望的。 为什么会这样,我怎么能得到它来推断出参考呢?
鉴于auto
,它被声明为非引用,因此我们处理的是pass-by-value案例。 并且auto
遵循模板参数推导的规则; int&
的引用部分将被忽略,然后推导出的类型为int
。
您可以使用decltype(auto)
(因为C ++ 14)。
type是
decltype(e)
,其中e
是初始化器。
template <typename T>
decltype(auto) foo(T&& o) { // no sample code is complete without a foo
return o.get();
}
返回类型推导为decltype(o.get())
,并根据decltype
规则,
如果表达式的值类别是左值,则decltype产生
T&
;
c.get()
返回int&
,这是一个左值,那么我们得到的返回类型int&
的insteand int
。
顺便说一句:请注意,如果仍然按值传递o
,则返回的引用将被悬空。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.