【发布时间】:2019-03-19 12:24:54
【问题描述】:
class Obj {
public:
Obj(int aa, int bb): a(aa), b(bb) {}
Obj(const Obj& o) {a = o.a; b = o.b;std::cout << "copying" << std::endl;}
Obj(Obj&& o) {a = o.a; b = o.b;std::cout << "moving" << std::endl;}
int a;
int b;
};
const Obj& Min(const Obj &o1, const Obj &o2) {
if (o1.a > o2.a) {
return o1;
} else {
return o2;
}
}
int main() {
using namespace std;
auto o1 = Obj(1,1);
auto o2 = Obj(2,2);
auto res = Min(o1, o2);
cout << res.a << endl;
res.a = 100;
cout << o1.a << endl;
cout << o2.a << endl;
return 0;
}
程序仍然会打印一个单词copying,表示复制构造函数已激活。那么构造函数在哪里调用呢?为什么函数没有返回o1的引用,所以修改res的值也会改变o1的值?
【问题讨论】:
-
尝试
auto& res = Min(o1, o2),但不要指望res.a = 100会起作用,因为您将返回const参考。 -
所以这意味着构造是在将
Min返回的左引用分配给非引用变量res时实现的?如果我需要使用auto&& res = Min(...)来获取值怎么办,我该如何做呢? -
无论如何,返回一个
const引用将阻止修改o1。 -
另见
decltype(auto),这里的答案都没有提到;这可以在无需编写参考的情况下获得参考,因此如果您编写的代码必须是通用的,那就更好了。 @coincheung 你是什么意思“如果”?你刚写的。但是你有什么理由需要一个右值引用吗?如果您返回对const对象成员的引用,您仍然会得到const引用。世界上所有的通用代码都无法绕过这一点,这是正确的。
标签: c++ c++11 pass-by-reference auto lvalue