gpt4 book ai didi

c++ - 通过对其基类的引用移动对象后,对象的状态是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:32 25 4
gpt4 key购买 nike

假设,有两个类的层次结构:

class Base {};
class Foo: public Base {};

像这样使用:

Foo foo;
Base &base = foo;
Base moved = std::move(base);

在这样的移动之后 foo 处于什么状态?标准是否对此类代码有任何限制要求?

最佳答案

标准没有对不属于标准库的 C++ 类的移动构造函数提出任何此类要求。图书馆作家可以自由地做他们想做的事。对于作为标准库一部分的组件,C++17 标准确实说明了一些事情(强调我的)

§ 20.5.5.15 库类型的移出状态 [lib.types.movedfrom]

Objects of types defined in the C++ standard library may be moved from (15.8). Move operations may be explicitly specified or implicitly generated. Unless otherwise specified, such moved-from objects shall be placed in a valid but unspecified state.

对于标准库中作为继承层次结构一部分的类,您必须查阅文档以了解当您尝试从基类右值引用派生类对象移动构造基对象时会发生什么。因此,如果您可以具体说明您担心的具体类(class),我可以尝试提供更多帮助。


不确定这与您的问题有多相关,但关于在这样的构造函数中真正会发生什么。请记住,对于将要构造的对象,虚函数机制在构造函数中是禁用的,但对于引用的对象,不是。在下面的例子中

class Base {
public:
virtual vector<int> extract_vector() { ... }

// Move constructor can use virtual functions on the other object
Base(Base&& other) {
this->vec = other.extract_vector();
}

private:
std::vector<int> vec;
};

class Foo : public Base {
public:
vector<int> extract_vector() override { ... }

private:
// this does something ¯\\_(ツ)_/¯
SpecialVectorAdaptor<std::vector<int>> vec;
};

将调用Base 的移动构造函数中other 上的虚函数extract_vector,您可以在 上使用虚方法>其他对象。但是您不能在将要构造的类上使用任何此类虚拟方法。


长话短说,您显示的代码的行为将严格取决于相关类的实现。

关于c++ - 通过对其基类的引用移动对象后,对象的状态是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44905543/

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