簡體   English   中英

如何刪除移動賦值運算符並保​​持與std容器的兼容性?

[英]How to delete the move assignment operator and retain compatibility with std containers?

我有一個簡單的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;
};

這里的問題是,一旦我明確刪除了移動賦值運算符,我就不能再將這個類與std容器和算法一起使用了。 顯然我確實需要刪除或正確實現它,因為我剛剛學到了很多困難。

另一種方法是通過常規賦值運算符實現移動賦值,但我不確定如何正確執行。 我想我需要像std::remove_reference這樣的東西? 我想知道它是否會刪除一個太多的引用並導致創建不必要的臨時對象。

顯然我確實需要刪除或正確實現它,因為我剛剛學到了很多困難。

不,你沒有。

您的類具有用戶定義的復制構造函數,復制賦值運算符和析構函數,因此編譯器不會為您定義移動賦值運算符。

所以只需停止嘗試刪除它,該類將被復制而不是移動。

對於已刪除的移動操作,您無法復制該類型的rvalues,即,它很難用作值類型(包括在容器中)。 沒有移動操作,它只會執行rvalues的深層復制,這是安全的,可能你想要的。

如果您希望類完全不可移動且不可復制,則刪除移動操作才有意義,例如,對象標識是關鍵的互斥體類型,而不是其值。 具有已刪除移動的可復制類型永遠不會有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM