Biraz araştırma yaptıktan sonra, yazıcının/devredilebilir olmasını gerektiren, C++11 has a defect allocators ile görüyorum. Eminim bu sorunun nedeni budur, ancak silinmiş ve beyan edilmemiş taşıma semantiği arasındaki davranış hakkında kafam karıştı. Silinen taşıma semantiği neden std :: vector ile sorunlara yol açıyor?
Ben MSVC12 ve Clang hem derlenmeyecektir aşağıdaki kodu: ( live sample)xmemory0(600): error C2280: 'Copyable::Copyable(Copyable &&)' : attempting to reference a deleted function
Ve Clang tarih::
Bu ile MSVC üzerinde derlenmeyecektir#include <vector>
class Copyable
{
public:
Copyable() = default;
Copyable(Copyable const& other)
: m_int(other.m_int)
{}
Copyable& operator= (Copyable const& other)
{
m_int = other.m_int;
return *this;
}
Copyable(Copyable&&) = delete;
Copyable& operator= (Copyable&&) = delete;
private:
int m_int = 100;
};
int main()
{
std::vector<Copyable> objects;
objects.push_back(Copyable{});
}
new_allocator.h:120:23: error: call to deleted constructor of 'Copyable'
Her iki durumda da, açıkça silinen taşıma yapısını/atamasını kaldırdığımda yöntemler, kod derler. AFAIK, kopya atama/oluşturma yöntemlerini bildirdiğinizde derleyici, ilgili taşıma üyelerini örtülü olarak bildirmez. Bu yüzden hala etkin bir şekilde silinmeli, değil mi? Hareket yapısı/atamasının açık bir şekilde silinmesini kaldırdığımda kod neden derleniyor?
Genel olarak bu C++ 11 hatası için iyi bir çözüm nedir? Nesnelerimin hareketli olmasını istemiyorum (ancak kopyalanabilirler).
Bir kopyasını kullanarak harekete geçin? –
Ayrıca, ilgili: [Neden C++ 11-Silinen fonksiyonlar aşırı yük çözünürlüğüne katılır?] (Http: // stackoverflow.com/questions/14085620/why-do-c11-silindi-functions-aşırı-yük-çözünürlükte) – Nawaz