gpt4 book ai didi

c++ - 强制复制赋值超过 move 赋值运算符

转载 作者:行者123 更新时间:2023-12-01 13:10:58 28 4
gpt4 key购买 nike

假设我有一个定义了复制和 move 赋值运算符的对象。当我写这个:

Object a(/*parameters 1*/);
/* some code */
a = Object(/*parameters 2*/);

第三行很可能会调用 move 赋值运算符。如何强制编译器改用复制赋值?相关地,如何强制复制 move 构造函数?基本上我要求反向 std::move()

我为什么要这个?

第 1 行和第 3 行之间的代码(我无法更改)获取了一些指向 a 字段的指针。 ,即 a 的内存布局很重要没有改变(最有可能是什么 move ),而是用新值覆盖。

此外,我的对象只是 std::vector .当我 move 分配它时,编译器只会将其底层数组的指针重定向到右值 vector 的数组。当我复制分配它(并且之前的 vector a 更长)时,它的底层数组将被覆盖,但它们的地址将保持不变。不幸的是,“一些代码”存储了类似 &a[2] 的指针。 ,它们可能不会改变。

最佳答案

My object is just the std::vector. When I move assign it, the compiler will just redirect the pointer of its underlying array to the array of the rvalue vector. When I copy assign it (and the previous vector a was longer) then its underlying array will be overwritten but their addresses will stay the same. The "some code" unfortunately stores pointers like &a[2], and they may not change.



那时您将需要除复制分配之外的其他东西,因为复制分配也不安全。

当然,这个例子有效:
auto a = std::vector{1, 2};
auto const b = std::vector{3, 4};

auto pointer = a.data() + 1; // points to second element

a = b; // copy

std::cout << *pointer; // prints 4?

这可能有效,但并非总是如此!

考虑一下:
auto a = std::vector{1, 2};
auto const b = std::vector{3, 4, 5}; // three elements!

auto pointer = a.data() + 1; // points to second element

a = b; // copy. a's buffer is too small, must reallocate

std::cout << *pointer; // points in the old buffer, invalid.

指向然后分配的 vector 元素的指针是 不安全 !

那你能做什么?

定义您自己的操作:
struct Object {
// ... stuff

auto safe_assign(Object const& other) & -> void {
mem1 = other.mem1;
mem2 = other.mem2;

// let 'mem_vec' be your memeber vector
assert(mem_vec.size() == other.mem_vec.size());

// safe copy, will never reallocate.
std::copy(other.mem_vec.begin(), other.mem_vec.end(), mem_vec.begin());
}
};

关于c++ - 强制复制赋值超过 move 赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59989331/

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