2015-07-31 13 views
6

Thomas Becker's "C++ Rvalue References" okumayı bitirdim. Rvalues ​​ve Rvalue referansları hakkında birkaç sorum var. AyrıcaTüretilmiş sınıflar, bir temel sağladığında taşıma semantiği uygulamak gerekir mi?

template <class T> 
MyArray 
{ 
    ... 
    T* m_ptr; // Pointer to elements 
    size_t m_count; // Count of elements 
}; 

sağladığı varsayalım: Basit dizi sınıf var

varsayalım varsayalım

#if(__cplusplus >= 201103L) 
MyArray(MyArray&& t) 
    : m_ptr(std::move(t.m_ptr)), m_count(std::move(t.m_count)) 
{ 
    t.m_ptr = NULL; 
    t.m_count = 0; 
} 
MyArray operator=(MyArray&& t) 
{ 
    std::swap(*this, t); 
    return *this; 
} 
#endif 

Şimdi var değil yeni veri üye eklemek yapan bir türetilmiş sınıf:

nedir??

MyImprovedArray(MyImprovedArray&&) ve MyImprovedArray& operator=(MyImprovedArray&&)'a da ihtiyaç var mı? Eğer öyleyse, sadece std::move taban sınıfını gerçekleştirmeli mi? Yoksa std::swap'u da yapması gerekiyor mu?

MyImprovedArray(MyImprovedArray&& t) 
    : MyArray(t) 
{ 
} 
+0

Şüphesiz, yine de 'MyImprovedArray (MyImprovedArray &&) = default' ' – Jarod42

+0

yapabilirsiniz. Sanal bir tabanınız olmadığı sürece, varsayılan değerler iyidir. Bir sanal tabana sahipseniz, [kopyalama/taşıma atamaları operatörünüze bir göz atmanız gerekebilir] (http://stackoverflow.com/questions/17252869/danger-with-virtual-base-move-assignment-operators- zaman-onlar-şimdi-izin verilir-kadar). –

cevap

5

Rule of five (veya sıfır) ne olursa olsun, temel sınıf tanımlayan bölgesinin türetilen sınıfları için geçerlidir.

Türetilmiş MyImprovedArray 'un hareket ettiricisi hareket edeni özel bir şey yapmayacaksa, onu tanımlamayın ve derleyicinin bir tane oluşturmasına izin verin.

+0

Yani, açık, bu MyImprovedArray'da herhangi bir şey yazmam gerekmediği anlamına mı geliyor? Yani, deklarasyon ve ': MyArray (std :: move (t))' (ve boş vücut) sahte mi? (Sorduğum için üzgünüm. C++ 'da birkaç kez ısırıldım * "İhtiyacınız olmadığında ödeme yapmayın" * mantra. Bu, sanal yıkıcılar ile kötü sonuçlandı). – jww

+3

Doğru (bir kurucudan açıkça). Bir yıkıcı tanımlamıyorsanız, yapıcıyı taşıyın, yapıcıyı kopyalayın, görev operatörünü taşıyın veya ödev operatörünü kopyalayın, sonra derleyici bunları sizin için yapar (sınıfın üyelerine göre kopyalanabilir/taşınabilir olduğu varsayılarak) – CoryKramer

İlgili konular