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

Zvi*_*cii 4 c++ shared-ptr rvalue-reference

所以我知道我们不能将右值引用绑定到左值,因此以下代码将无法编译:

class Base {};

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

但下一个代码可以编译,我不明白为什么。

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;
}
Run Code Online (Sandbox Code Playgroud)

通过类型推导,auto&&T&&forward reference,因为它们可以是 lvaue 引用、const 引用或右值引用。但在我的情况下(或者我的想法),也许在 share_ptr 中没有类型推导,但我引用的是 share_ptr 本身,而不是它的底层对象,所以我陷入了困境。

Mil*_*nek 6

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