簡體   English   中英

移動分配和引用成員

[英]Move-assignment and reference member

具有引用成員變量的類的復制賦值是禁止的,因為您無法重新分配引用。 但是移動分配怎么樣? 我試過簡單地move它,當然,當我只想移動引用本身時,它會破壞源對象:

class C
{
public:
    C(X& x) : x_(x) {}
    C(C&& other) : x_(std::move(other.x_)) {}
    C& operator=(C&& other)
    {
        x_ = std::move(other.x_);
    }
private:
    X& x_;
};

X y;
C c1(y);

X z;
C c2(z);

c2 = c1; // destroys y as well as z

我不應該只是實施移動分配並堅持使用移動構造嗎? 這使得swap(C&, C&)難以實現。

(根據OP的建議作為評論的答案發布)

一般來說,如果一個人想要用C ++中的引用做一些非平凡的事情,那么就會使用reference_wrapper<T> ,這對於T&來說本質上是一種奇特的價值語義替代,然后就可以用它完成 - 它已經完成了提供(重新)分配和其他操作。 我敢肯定,如果不是微不足道的話,那會使移動構造函數和賦值變得非常平凡(注意,根據is_trivially_*語義,這並不trivial )。

“參考包裝器”作為TR1的一部分添加到C ++ 03中,是C ++ 11的一部分。

文檔: http//en.cppreference.com/w/cpp/utility/functional/reference_wrapper

在某種意義上,參考是具有語法糖的T *const ,其頂部是自動消除,自動捕獲和自動生命延長時間。 (請注意,這不是真的,但通常是在實踐和實踐中)

如果你想要一個可重新引用的引用,C ++有:它們被稱為指針。 如果您願意,可以使用訪問器將取消引用替換為函數調用。 難以模擬的其余功能(臨時生命周期擴展)不適用於struct成員。

暫無
暫無

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

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