c++ - 对象 move 后,指向const vector 成员变量元素的指针是否保持稳定?

标签 c++ pointers vector constants move-semantics

考虑以下C++代码:

class B { ... }

class A {
  public:
    // Requires vec.size() >= 1
    A(std::vector<B> vec) : vec_(vec), b_(&vec_[0]) {}
    const std::vector<B> vec_;
    const B* b_;
}
如果我std::move一个类型为A的对象,或者甚至将其复制,指向b对象的指针b_是否会保持稳定和有效?我以为是因为vec_是const,但事实并非如此。

最佳答案

您的代码无法编译,因为您使用的是Class而不是class,并且因为std::vector<B>无法使用B类型的数据进行初始化。 See std::vector ctors
现在,常量数据无法移动。如果您使用类似A a1 = std::move(a)a是一个常量,因为a是常量,所以将调用复制ctor而不是移动ctor。
您如何期望从恒定数据转移?移动意味着窃取数据的内容(在此是恒定的)并将其置于有效状态。窃取意味着您正在更改不变的数据!
现在,由于不会通过从A移动来移动元素(因为它没有移动ctor),因此指针仍将指向数据。
但是,如果这样做,新的A中将具有相同的指针,但 vector 不同,如下所示

#include <vector>
#include <iostream>

class B { };

class A {
public:
    // Requires vec.size() >= 1
    A(std::vector<B> vec) : vec_(vec), b_(&vec_[0]) {}
    const std::vector<B> vec_;
    const B* b_;
};

int main(){
    std::vector<B> vec(1, B{});
    A a(vec);
    A a1 = std::move(a);
    if(a.b_ == a1.b_ && &a.vec_[0] != &a1.vec_[0])
        std::cout << "two pointers to the same location while the reality doesn't agree";

}
Live

关于c++ - 对象 move 后,指向const vector 成员变量元素的指针是否保持稳定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63044122/

相关文章:

c++ - 将整数转换为二进制字符串?

c - 遍历C指针列表: weird printf behaviour

c++ - 在 C++ 中的 int 集 vector 中插入值

c++ - 如何使用 wxWidgets 和 C++ 绘制单色图像,然后将其 "dump"转换为 vector ?

java - libsvm 适用于多输出回归吗?

c++ - InstallShield 先决条件(错误 -7067)

c++ - 你如何循环读取 C++ 套接字?

c++ - 使用 shared_ptr 时内存泄漏

c++ - 删除指针 vector 时遇到问题

c++ - 指向 std::vector 元素的指针