C ++奇怪的引用临时

时间:2013-03-12 17:45:27

标签: c++

我无法理解为什么以下代码在编译时因“返回临时引用”而失败。对我来说,单身人士不可能是暂时的,因为它是静止的!?

由于

#include <memory>

class Parent {
public:
    static const std::shared_ptr<Parent>& get_default_value();
    static const std::shared_ptr<Parent>& get_some_other_value();
};

class Child: public Parent {
public:
    Child(){}
    static const std::shared_ptr<Child>& singleton;
};

const std::shared_ptr<Child>& singleton = std::make_shared<Child>();

const std::shared_ptr<Parent>& Parent::get_default_value() {
    return singleton;
}

const std::shared_ptr<Parent>& Parent::get_some_other_value() {
    //FILL ME
}

Proof

编辑:父的默认值是Child的单身。 (之前还有其他一些名字,但这很令人困惑)。

编辑2:我也希望引用shared_pointers,因为默认情况发生了很多并且无论如何都是单例,所以也可以节省空间

编辑3:我想要一个std :: shared_ptr&amp;作为一种类型的结果,因为我希望界面与默认值和其他值

一致

编辑4:由于无关原因,其他值需要为shared_ptr&lt;&gt;。

3 个答案:

答案 0 :(得分:4)

您的问题是Child::singleton类型为std::shared_ptr<Child>&,但get_singleton返回std::shared_ptr<Parent>&std::shared_ptr<Child>可以转换为std::shared_ptr<Parent>但不能转换为std::shared_ptr<Parent>&,因此必须创建std::shared_ptr<Parent>类型的临时对象并返回对该引用的引用。

无论如何,通常没有理由通过引用返回shared_ptr。只需按值返回它就会编译。

答案 1 :(得分:2)

没有单身人士是你宣布它的临时方式。声明静态变量:

const std::shared_ptr<Child>& Child::singleton = std::make_shared<Child>();

注意Child::?另外在函数get_singleton中使用:

const std::shared_ptr<Parent>& Parent::get_singleton() {
    return Child::singleton;
}

答案 2 :(得分:0)

根据Dirk的分析,转换是问题所在,这是一个很好的解决方案:

class Parent {
public:
    static const std::shared_ptr<Parent>& get_singleton();
};

class Child: public Parent {
public:
    Child(){}
    static const std::shared_ptr<Parent>& singleton;
};

const std::shared_ptr<Parent>& singleton = std::make_shared<Child>();

const std::shared_ptr<Parent>& Parent::get_singleton() {
    return singleton;
}

Proof