2010-04-22 15 views
6

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 durumda
B 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.

+1

'std :: move' burada bir şey değiştiriyor mu? A() 'zaten bir ritim değil mi? –

+0

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

+2

@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. –

cevap

6

0x FCD'de 12.8'i okurken (özellikle hareket ettirici için 12.8/17), bu bir GCC hatası gibi görünüyor. 4.4'te yaptığınız gibi, 4.5'de de aynı şeyi görüyorum.

Silinen işlevler veya benzer bir işlevde bir köşe notu eksik olabilir, ancak ben bununla ilgili hiçbir belirti göremiyorum.

+0

Sadece 4.5 ile test ettim, aynı sonuçları elde ediyorum. Başka bir derleyicide test edebilir misiniz? (C++ 0x'un hiçbir şekilde bitmediği düşünüldüğünde, bu bir hata olmayabilir, ancak bu arada eski bir davranış olabilir.) – doublep

+3

12.8'de (N3053'ten başlayan) bir grup öğe gcc'de desteklenmiyor henüz, [C++ 0x destek sayfası] 'na göre (http://gcc.gnu.org/projects/cxx0x.html) - sorun bu olabilir mi? –

+0

@Mike: Öyle görünüyor, evet. –

İlgili konular