簡體   English   中英

使用非指針數據成員移動語義

[英]Move semantics with non-pointer data members

可能已經有人問過並回答了,但是我不知道要搜索什么。

如果數據成員定義了移動分配運算符,可以將移動語義用於非指針數據成員嗎?

假設我有一個M類,它定義了M::operator=(M&&)如下所示:

template <class T>
class M
{
public: 
    M()
    {
        mem_M = new T;
    }

    M& operator=(M&& src)
    {
        if (this != &src)
        {
            mem_M = src.mem_M;
            src.mem_M = nullptr;
        }
        return *this;
    }

private:    
    T* mem_M;
};

現在顯然我可以擁有一個這樣的類C<T> ,其移動構造函數不使用T的移動賦值運算符:

template <class T>
class C
{
public:
    C ()
    {
        mem_C = new T;
    }
    C (C&& rhs)
    {
        mem_C = rhs.mem_C;
        rhs.mem_C = nullptr;
    }

private:
    T* mem_C;
};

但是,如果我希望C<T>::mem_C不是指針而是普通成員,該如何在移動功能中處理C<T>::mem_C 當然,我可以調用移動賦值操作符T::operator=(T&&)到日提交的移動mem_C從一個實例向另一,但我如何正確復位的實例C傳遞給C<T>::C(C&&)

這至少對我來說似乎是錯誤的:

template <class T>
class C
{
public:
    C ()
    {
        mem_C = T();
    }
    C (C<T>&& rhs)
    {
        mem_C = std::move(rhs.mem_C);
        rhs.mem_C = T();          // ?? like this?
    }

private:
    T mem_C;
};

那么,在移動功能中重置非指針數據成員的標准兼容方法是什么?

所包含類型的移動分配/構造方法必須使對象處於“可接受”狀態,無論該類型意味着什么。 要移動的類型之外的任何東西都不對維護對象的狀態負責。

另外,您想確保在父級move 構造 函數中調用包含類型的move 構造函數 ,而不是在示例中調用包含類型的move 賦值

// move constructor calls move constructor of contained elements
C (C<T>&& rhs) : mem_c(std::move(rhs.mem_c))
{
    // anything in here is using already-constructed data members
}

// move assignment calls move assignment of contained elements
C & operator=(C<T>&& rhs) {
    mem_c = std::move(rhs.mem_c);
}

暫無
暫無

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

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