0
可能這已被問及已答覆,但我不知道要搜索什麼。使用非指針數據成員移動語義
如果數據成員已經定義了移動賦值運算符,可以將移動語義用於非指針數據成員嗎?
假設我有一個類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<T>::C(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;
};
那麼,什麼是對移動功能的非指針數據成員重置符合標準的方法是什麼?
指針是「普通成員」的子集。你似乎在問移動類類型和非類類型之間的區別 –
'mem_C = T();'應該被移除,對象已經被構建,所以這隻會浪費時間和資源。 –
在這種情況下,您可以也應該使用默認移動賦值運算符(請參見[Rule of zero](http://en.cppreference.com/w/cpp/language/rule_of_three)) –