所以我有一个小的类层次结构,我需要将
shared_ptr
传递给接受 rvalue 的基类。但是,在其中一种情况下,我想获取 shared_ptr
以便在 衍生 类之一中使用。
我的问题简化为:
https://godbolt.org/z/Kvaa7o1Gn
class Base {
public:
Base(std::shared_ptr<int>&& p)
: a_{p}
{
}
private:
std::shared_ptr<int> a_;
};
class Derived : public Base {
public:
Derived(std::shared_ptr<int> p)
: Base(copy_shared_ptr(p)) // this is of course not permitted, but I'd like to do something like this
{
}
private:
std::shared_ptr<int> copy_shared_ptr(std::shared_ptr<int> p)
{
p_ = p; // segfaults
std::cout << "Now p_ is " << p_.use_count() << std::endl;
return p_;
}
std::shared_ptr<int> p_;
};
int main() { Derived d{std::make_shared<int>(5)}; }
在继续之前不可能抓住
shared_ptr
,因为我需要先构造我的 base 类,然后才能初始化它。
是否有我可能错过的明显的习惯用法来实现这一目标?
您可以将副本传递给
Base
,然后将原件存储在 p_
Derived(std::shared_ptr<int> p)
: Base({p}), p_(std::move(p))
{
}