gpt4 book ai didi

c++ - 为什么在变量中存储右值引用会导致它悬空

转载 作者:行者123 更新时间:2023-11-30 02:29:00 32 4
gpt4 key购买 nike

我有一个抽象基类和一些具体的子类:

class AbstractBaseClass {
private:
bool destructed {};
public:
virtual ~AbstractBaseClass() { destructed = true; }
// returns false unless we're calling on already destructed value
bool leaked() { return destructed; };
};

class ConcreteSubClassA : public AbstractBaseClass {
public:
~ConcreteSubClassA() override {}
};
class ConcreteSubClassB : public AbstractBaseClass {
public:
~ConcreteSubClassB() override {}
};

谁能给我解释一下为什么右值引用到子类实例在这些情况下不会泄漏:

static_cast<AbstractBaseClass&&>(ConcreteSubClassA()).leaked(); // false

std::forward<AbstractBaseClass>(ConcreteSubClassA()).leaked(); // false

((rand() & 1)
? static_cast<AbstractBaseClass&&>(ConcreteSubClassA())
: static_cast<AbstractBaseClass&&>(ConcreteSubClassB())
).leaked(); // false

((rand() & 1)
? std::forward<AbstractBaseClass>(ConcreteSubClassA())
: std::forward<AbstractBaseClass>(ConcreteSubClassB())
).leaked(); // false

AbstractBaseClass&& abc = ConcreteSubClassA();
abc.leaked(); // false

AbstractBaseClass&& abc = static_cast<AbstractBaseClass&&>(ConcreteSubClassA());
abc.leaked(); // false

但是在这些里面呢?

AbstractBaseClass&& abc = std::forward<AbstractBaseClass>(ConcreteSubClassA());
abc.leaked(); // true

AbstractBaseClass&& abc = (rand() & 1)
? static_cast<AbstractBaseClass&&>(ConcreteSubClassA())
: static_cast<AbstractBaseClass&&>(ConcreteSubClassB());
abc.leaked(); // true

AbstractBaseClass&& abc = (rand() & 1)
? std::forward<AbstractBaseClass>(ConcreteSubClassA())
: std::forward<AbstractBaseClass>(ConcreteSubClassB());
abc.leaked(); // true

也就是为什么这么早就调用了析构函数?

最佳答案

临时对象在完整表达式的末尾被销毁(除非绑定(bind)到引用)。这个事实解释了临时工作的直接用途。

当将临时对象直接绑定(bind)到一个引用时,即 const&&&,它的生命周期会延长到匹配引用的生命周期。这就是您的示例直接(或通过强制转换)绑定(bind)到右值的原因。

当将一个左值绑定(bind)到一个引用时,生命周期不会得到扩展——不能指望编译器看穿这个结构。将左值转换为右值引用不会有所不同。请注意,右值引用是左值。

当然,返回 trueleaked() 的结果取决于未定义的行为:在对象被销毁时,如果不调用 undefined 就无法触摸它行为。

关于c++ - 为什么在变量中存储右值引用会导致它悬空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40060524/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com