通过引用而不是值从函数中获取对象

时间:2014-04-25 12:10:16

标签: c++ function stack shared-ptr

我想知道下面的代码是否正确 - 它适用于这种情况,但可能只是因为它的简单性。是什么让我想知道: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;
}

2 个答案:

答案 0 :(得分:2)

这很奇怪,但很安全。

将临时对象绑定到引用会将其生命周期延长到引用的生命周期;所以你所做的就等同于创建一个本地对象变量。使用引用会增加混淆,要求读者了解这些奇怪的规则,以了解发生了什么,但不会改变程序的有效性或行为。

答案 1 :(得分:1)

在这两种情况下

AP const& a = get();

AP const& a = get2();

使用const引用绑定临时对象。该对象将存活,而将有活着的引用。所以你的代码没有问题。

相关问题