2010-04-22 10 views
6

Perché esiste un costruttore di spostamento predefinito o un operatore di assegnazione non creato per le classi derivate? Per dimostrare cosa intendo; avendo questo codice di impostazione:Sposta il costruttore e l'operatore di assegnazione: perché nessun valore predefinito per le classi derivate?

#include <utility> 

struct A 
{ 
    A() { } 
    A (A&&) { throw 0; } 
    A& operator= (A&&) { throw 0; } 
}; 

struct B : A 
{ }; 

una delle seguenti linee getta:

A x (std::move (A()); 
A x; x = A(); 

ma nessuno dei seguenti fa:

B x (std::move (B()); 
B x; x = B(); 

Nel caso in cui è importante, ho provato con GCC 4.4 .

MODIFICA: il test successivo con GCC 4.5 ha mostrato lo stesso comportamento.

+1

Il file 'std :: move' cambia qui? Non è 'A()' già un valore? –

+0

Sì, lo fa. Altrimenti lo standard C++ consente al compilatore di comprimerlo in just-construct-x (o così mi è stato detto su freenode.net). Ho anche verificato che senza 'std :: move' il costruttore di move non è attivato, quindi il commento di freenode.net sembra essere vero. – doublep

+2

@Mike: copia elision (12.8/34, 0x FCD) è un ottimizzazione comune, ma l'uso di move() fa sì che questa espressione non rientri nelle circostanze consentite. –

risposta

6

Leggendo attraverso 12.8 nel 0x FCD (12.8/17 in particolare per il codice di movimento), questo sembra essere un bug GCC. Vedo la stessa cosa che accade in 4.5 come fai in 4.4.

Potrei mancare un caso d'angolo su funzioni cancellate, o qualcosa di simile, ma non ne vedo ancora alcuna indicazione.

+0

Appena testato con 4.5, ottengo gli stessi risultati. Puoi testare su qualsiasi altro compilatore? (Dato che C++ 0x non è in alcun modo completato, potrebbe non essere un bug ma piuttosto un comportamento obsoleto, a proposito.) – doublep

+3

Un sacco di cose in 12.8 (originato in N3053) non è supportato in 'gcc' ancora, secondo la loro [pagina di supporto C++ 0x] (http://gcc.gnu.org/projects/cxx0x.html) - potrebbe essere questo il problema? –

+0

@ Mike: Sembra, sì. –

Problemi correlati