gpt4 book ai didi

c++ - 如何删除 move 赋值运算符并保​​持与标准容器的兼容性?

转载 作者:太空狗 更新时间:2023-10-29 19:45:35 25 4
gpt4 key购买 nike

我有一个用于管理特定资源的简单 RAII 包装器。这是界面:

struct ResourceWrapper
{
explicit ResourceWrapper(RESOURCE resource);
ResourceWrapper(const ResourceWrapper& other);
ResourceWrapper& operator=(const ResourceWrapper& other);
~ResourceWrapper();

ResourceWrapper(ResourceWrapper&& other) = delete;
ResourceWrapper& operator=(ResourceWrapper&& other) = delete;
};

这里的问题是,一旦我明确删除 move 赋值运算符,我就不能再将此类与 std 容器和算法一起使用。显然,我确实需要删除或正确实现它,因为我刚刚学到了艰难的方法。

另一种选择是通过常规赋值运算符实现 move 赋值,但我不确定如何正确地做到这一点。我想我需要像 std::remove_reference 这样的东西?我想知道它是否会过多地删除一个引用并导致创建不必要的临时对象。

最佳答案

And obviously I do need to either delete or properly implement it, as I've just learned the hard way.

不,你不知道。

您的类具有用户定义的复制构造函数、复制赋值运算符和析构函数,因此编译器不会为您定义 move 赋值运算符。

所以只要停止尝试删除它,类将被复制而不是 move 。

使用deleted move 操作,您无法复制该类型的右值,即它变得极难用作值类型(包括在容器中)。在没有 move 操作的情况下,它只会对右值进行深度复制,这是安全的,而且可能是您想要的。

仅当您希望类完全不可 move 和不可复制时,删除 move 操作才有意义,例如类似于互斥锁类型,其中对象标识至关重要,而不是它的值。具有已删除 move 的可复制类型是没有意义的。

关于c++ - 如何删除 move 赋值运算符并保​​持与标准容器的兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856169/

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