gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:00:06 24 4
gpt4 key购买 nike

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

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