Perché alcuni compilatori non sintetizzano le operazioni di spostamento per questo paragrafo in C ++ Primer 5th?

1

In particular, if a class defines its own copy constructor, copy-assignment operator, or destructor, the move constructor and move-assignment operator are not synthesized.

- citazione da "13.6.2 Move Constructor and Move Assignment"

Perché alcuni compilatori non sintetizzano le operazioni di spostamento per questo paragrafo in C ++ Primer 5th?

    
posta CountingStars 26.09.2015 - 11:45
fonte

1 risposta

2

Non sono solo alcuni compilatori. Nelle condizioni elencate nella citazione, i compilatori sono esplicitamente vietati per sintetizzare le operazioni di spostamento.

Le operazioni di spostamento sono state aggiunte di recente al linguaggio C ++, molto tempo dopo che aveva operazioni di copia e distruttori. E una cosa che i manutentori dello standard di linguaggio C ++ cercano di mantenere è che le nuove funzionalità nel linguaggio non infrangono il codice esistente, specialmente se questo non fa parte dell'uso tradizionale del linguaggio.

Se una classe ha il proprio costruttore di copia, operatore di copia-assegnazione e / o distruttore, allora nella maggior parte dei casi queste funzioni stanno facendo del lavoro che la versione sintetizzata dal compilatore non può o non vuole fare. Se il compilatore sintetizza le operazioni di spostamento per tale classe, allora è molto probabile che quelle operazioni di spostamento non facciano la cosa giusta.
Ad esempio, si dispone di una classe che mantiene una connessione al database e ha tutte le operazioni di copia e distruttore corrette per garantire che la connessione venga chiusa al momento giusto. Se il compilatore sintetizzava le operazioni di spostamento per una classe di questo tipo, l'oggetto spostato da chiudere la connessione al database, mentre l'oggetto spostato continua a utilizzare quella connessione.

Esistono tutti i tipi di tecniche per evitare tali problemi, ma quelli non sono sempre usati in modo coerente nel codice legacy e per evitare di rompere quel grosso codice di codice è stato deciso che le operazioni di spostamento non sarebbero state aggiunte in modo silenzioso alle classi in cui potrebbe rompersi il funzionamento della classe.
Se desideri eseguire operazioni di spostamento in una classe che dispone di un proprio costruttore di copia, operatore di copia o distruttore, devi scrivere tu stesso il costruttore di movimento e l'operatore di spostamento per assicurarti che facciano la cosa giusta.

    
risposta data 26.09.2015 - 12:26
fonte

Leggi altre domande sui tag