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.
Il file 'std :: move' cambia qui? Non è 'A()' già un valore? –
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
@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. –