In C++ 11, è possibile impostare in modo esplicito una funzione membro speciale, se la sua generazione implicita è stata automaticamente impedita.Attivazione della generazione della funzione membro speciale predefinita predefinita
Tuttavia, l'impostazione predefinita predefinita di una funzione membro speciale annulla l'eliminazione implicita causata dalla dichiarazione manuale di alcune delle altre funzioni membro speciali (operazioni di copia, distruttore, ecc.), Non impone al compilatore di generare la funzione e il codice è considerato ben formato anche se la funzione non può in effetti essere generata.
Si consideri il seguente scenario:
struct A
{
A() = default;
A (const A&) = default;
A (A&&) = delete; // Move constructor is deleted here
};
struct B
{
B() = default;
B (const B&) = default;
B (B&&) = default; // Move constructor is defaulted here
A a;
};
Il costruttore mossa in B non verrà generato dal compilatore, perché così facendo avrebbe causato un errore di compilazione (costruttore mossa di A viene eliminato). Senza cancellare esplicitamente il costruttore di A, il costruttore di movimento di B verrebbe generato come previsto (copia A, anziché spostarlo).
di tentare di spostare un oggetto del genere silenziosamente utilizzare il costruttore copia anziché:
B b;
B b2 (std::move(b)); // Will call B's copy constructor
C'è un modo per forzare il compilatore nella generazione sia la funzione o emettere un errore di compilazione, se non si può? Senza questa garanzia, è difficile fare affidamento sui costruttori di movimento predefiniti, se un singolo costruttore eliminato può disabilitare lo spostamento per le gerarchie di un intero oggetto.
Non dovresti sapere se i membri che stai includendo sono mobili o no? – NathanOliver
Possono essere mobili quando la classe è stata originariamente implementata, tuttavia, se più membri vengono aggiunti in seguito, il requisito mobile potrebbe essere trascurato (specialmente se sono aggiunti da qualcun altro). –
Va notato che un tipo che cancella il suo costruttore di mosse ma * non * il suo costruttore di copia è molto ... bizzarro. Non c'è assolutamente nulla da guadagnare facendo questo. Quindi potrebbe essere meglio ignorare questo caso, considerandolo come il risultato di qualcuno che fa qualcosa di idiota senza motivo. –