[英]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.