我想知道下面的代码是否正确 - 它适用于这种情况,但可能只是因为它的简单性。是什么让我想知道:function(f1)按值返回对象但是在调用它的函数中(f2)我通过引用而不是值来获取此对象。这是一个问题吗?我想知道,因为它对我来说看起来有点奇怪,但它有效,我认为它应该有效。因为对象是在f1的堆栈上创建的,然后(通过值)返回到堆栈f2,然后在f1堆栈上创建的f2堆栈上获得对该对象的引用。你怎么看待这个?
class A {
public:
A(){a=100; b=200;}
int a;
int b;
};
typedef boost::shared_ptr<A> AP;
AP get(){
AP a = AP(new A());
return a;
}
AP get2(){
AP const& a = get();
return a;
}
int main() {
AP const& a = get2();
std::cerr << a->a << std::endl;
return 0;
}
答案 0 :(得分:2)
这很奇怪,但很安全。
将临时对象绑定到引用会将其生命周期延长到引用的生命周期;所以你所做的就等同于创建一个本地对象变量。使用引用会增加混淆,要求读者了解这些奇怪的规则,以了解发生了什么,但不会改变程序的有效性或行为。
答案 1 :(得分:1)
在这两种情况下
AP const& a = get();
和
AP const& a = get2();
使用const引用绑定临时对象。该对象将存活,而将有活着的引用。所以你的代码没有问题。