为何可将派生类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
相关产品推荐
相关产品推荐

