You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何可将派生类shared_ptr绑定至基类shared_ptr右值引用?

为什么右值引用能绑定到不同类型的左值shared_ptr?

你第一个代码编译失败的原因很直接:base是std::shared_ptr<Base>类型的左值,而std::shared_ptr<Base>&&是该类型的右值引用。C++明确规定,同类型的右值引用不能直接绑定到左值,所以编译器报错是符合预期的。

第二个代码能编译的核心在于隐式类型转换生成的临时对象:

  • derived是std::shared_ptr<Derived>类型的左值,但我们要绑定的是std::shared_ptr<Base>&&。由于Derived继承自Base,std::shared_ptr支持这种向上转型的隐式转换——编译器会自动创建一个临时的std::shared_ptr<Base>对象,把derived的内容转换过去。
  • 临时对象属于右值,而右值引用的设计本来就允许绑定到右值(包括这种临时对象),所以这段代码完全符合C++规则,能够正常编译。

你提到的转发引用(forward reference)确实和这个场景无关,这里没有类型推导,只是利用了隐式转换产生的临时右值来满足右值引用的绑定要求。

第一个无法编译的代码示例

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; // 合法:隐式转换生成临时std::shared_ptr<Base>右值
}

内容的提问来源于stack exchange,提问作者Zvicii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 14:37:14