所以我知道我们不能把右值引用绑定到左值,所以下面的代码不能编译:
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本身,而不是它的底层对象,所以我卡住了。
1条答案
按热度按时间6fe3ivhb1#
std::shared_ptr<Derived>
可以隐式转换为std::shared_ptr<Base>
。当这种情况发生时,会创建一个新的临时对象,std::shared_ptr<Base>&&
可以绑定到该对象。由于该对象是一个纯右值,因此其生存期会延长到引用的生存期。