c++ 为什么我可以绑定基类shared_ptr右值引用到派生类shared_ptr?

toe95027  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(211)

所以我知道我们不能把右值引用绑定到左值,所以下面的代码不能编译:

class Base {};

int main(int argc, char** argv) {
    std::shared_ptr<Base> base = std::make_shared<Base>();
    std::shared_ptr<Base>&& ref = base;
}

但是下一个代码可以编译,我不知道为什么。

class Base {};
class Derived : public Base {};

int main(int argc, char** argv) {
    std::shared_ptr<Derived> derived = std::make_shared<Derived>();
    std::shared_ptr<Base>&& ref = derived;
}

通过类型推导,auto&&T&&forward reference,因为它们可以是lvaue引用、const引用或右值引用,但在我的情况下(或我认为的),可能在share_ptr中没有类型推导,但我引用的是share_ptr本身,而不是它的底层对象,所以我卡住了。

6fe3ivhb

6fe3ivhb1#

std::shared_ptr<Derived>可以隐式转换为std::shared_ptr<Base>。当这种情况发生时,会创建一个新的临时对象,std::shared_ptr<Base>&&可以绑定到该对象。由于该对象是一个纯右值,因此其生存期会延长到引用的生存期。

相关问题