考虑以下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/