Neden türetilmiş sınıflar için oluşturulmamış oluşturucu veya atama işleci var? Ne demek istediğimi göstermek için; Bu kurulum koduna sahip:Kurucu ve atama işlecini taşıyın: türetilmiş sınıflar için neden varsayılan yok?
A x (std::move (A());
A x; x = A();
ancak aşağıdaki hiçbiri yapar: Aşağıdaki satırları
#include <utility>
struct A
{
A() { }
A (A&&) { throw 0; }
A& operator= (A&&) { throw 0; }
};
struct B : A
{ };
ya atar
bu konularda durumdaB x (std::move (B());
B x; x = B();
, ben GCC 4.4 ile test .
DÜZENLEME: Daha sonra GCC 4.5 ile yapılan test aynı davranışı gösterdi.
'std :: move' burada bir şey değiştiriyor mu? A() 'zaten bir ritim değil mi? –
Evet, öyle. Aksi taktirde C++ standardı derleyicinin bunu sadece yapı-x'e (ya da freenode.net'de anlatıldığından) sıkıştırmasını sağlar. Ayrıca std :: move 'hareket ettiricisinin tetiklenmemiş olduğunu doğruladım, bu yüzden freenode.net'in yorumu doğru görünüyor. – doublep
@Mike: Kopyalama seçimi (12.8/34, 0x FCD) yaygın bir optimizasyondur, ancak move() işlevini kullanmak, bu ifadenin izin verilen durumlar dışında kalmasını sağlar. –