In C++, se una classe ha un membro dati di riferimento, l'operatore di assegnazione predefinito non viene sintetizzato dal compilatore. Perché?Perché un operatore di assegnazione predefinito non viene sintetizzato dal compilatore se una classe ha un membro dati di riferimento
risposta
In C++, se una classe ha un elemento di dati di riferimento l'operatore di assegnazione predefinito non è sintetizzato da compilatore. Perché?
Che assegnamento per copia dovrebbe fare è definita in:
C++ 03 standard 12.8/13:
Ogni sotto-oggetto viene assegnato in modo appropriato per il tipo:
se il sotto-oggetto è di tipo di classe, l'operatore di assegnazione copia per la classe è usato (come se per qualifica esplicita; cioè, ignorando qualsiasi possibile funzione di override virtuale in più classi derivate);
se il sottooggetto è una matrice, ogni elemento è assegnato, nel modo appropriato al tipo di elemento;
se il sottooggetto è di tipo scalare, viene utilizzato l'operatore di assegnazione incorporato.
In breve implica che ogni dell'organo dovrebbe assegnato in modo adeguato
che solleva la questione,
Quale dovrebbe essere il comportamento per l'assegnazione di un organo di riferimento in classe?
Si consideri il seguente sui riferimenti:
- I riferimenti sono intrinsecamente non assegnabili, continuano a riferimento lo stesso referrant a cui sono stati inizializzati [Ref 1].
- In virtù di
#1
l'assegnazione a un riferimento non riassegna il riferimento, modifica il valore del referrant che è un comportamento non intuitivo.
Non v'è alcun comportamento corretto di default deve essere eseguita qui, ma piuttosto una situazione one.So mandati C++ standard che progettista della classe è in posizione migliore per determinare questo comportamento e da qui la decisione che operatore di assegnazione di default non dovrebbe essere sintetizzato dal compilatore se una classe ha un membro di dati di riferimento.
Questa decisione è specificato in:
C++ 03 standard 12.8/12:
Un operatore di assegnamento per copia implicitamente dichiarata è implicitamente definito quando un oggetto di questo tipo di classe è assegnato un valore del suo tipo di classe o un valore di un tipo di classe derivato dal suo tipo di classe. Un programma è mal formata se la classe per la quale un operatore di assegnamento per copia è implicitamente definito ha:
.......
- un membro di dati non statico di tipo di riferimento, o
.......
[Ref 1]
C++ 03 standard 8.5.3/2:
Un riferimento non può essere modificato per fare riferimento a un altro oggetto dopo l'inizializzazione. Si noti che l'inizializzazione di un riferimento viene trattata in modo molto diverso dall'assegnazione ad esso. L'argomento passing (5.2.2) e function value return (6.6.3) sono inizializzazioni.
Ha visto la discussione in un forum di soli membri. Poiché la risposta non è ben nota alla maggior parte dei programmatori, vorrebbe pubblicare la risposta e condividerla qui.
Da C++ progetto di norma N3337 §12.8.23:
Una copia/spostamento operatore di assegnazione stabilizzato per la classe X è definito come eliminato se X ha:
- dell'utente variante con un non -trivial corrispondente operatore di assegnazione e X è una classe unione-simili, o
- un membro di dati non statica di const tipo non-classe (o matrice di esso), o
- un non-stati c membro di riferimento del tipo di riferimento o
- un membro di dati non statici di classe tipo M (o matrice dello stesso) che non può essere copiato/spostato perché risoluzione di sovraccarico (13.3), come applicato all'operatore di assegnazione corrispondente di M corrispondente in un'ambiguità o una funzione eliminata o inaccessibile dall'operatore di assegnazione predefinito o
- una classe di base diretta o virtuale B che non può essere copiata/spostata perché risoluzione sovraccarico (13.3), applicata all'operatore di assegnazione corrispondente di B , restituisce un'ambiguità o una funzione che viene cancellata o inaccessibile dall'operatore di assegnazione predefinito o
- per l'operatore di assegnazione spostamento, un membro dati non statico o classe base diretta con un tipo che non ha un operatore di assegnazione spostamento e non è banalmente copiabile o qualsiasi classe di base virtuale diretta o indiretta.
È fantastico che tu abbia postato una citazione dallo standard, ma è più importante capire il * motivo *: che l'operatore di assegnazione dovrebbe assegnare al membro di riferimento dell'oggetto LHS un nuovo valore, ma i riferimenti non possono essere assegnato (sono implicitamente costanti). – HighCommander4
- 1. Operatore di assegnazione con membro della classe di riferimento
- 2. C++ operatore predefinito di assegnazione
- 3. Costruttore di copia "quasi predefinito" (& operatore di assegnazione) in C++
- 4. Operatore di assegnazione C++ nella classe derivata
- 5. Operatore di assegnazione predefinito nella classe interna con gli elementi di riferimento
- 6. Perché un enumerato non viene controllato dal compilatore C?
- 7. Operatore di assegnazione C++ - compilatore generato o personalizzato?
- 8. Se un operatore è sovraccarico per una classe C++, come posso invece utilizzare un operatore predefinito?
- 9. Cancellare uno std :: vector richiede un operatore di assegnazione. Perché?
- 10. L'operatore di assegnazione predefinito chiama l'operatore = su tutti i membri?
- 11. Operatore di assegnazione di riferimento in PHP, = &
- 12. Perché una classe con costruttori ereditati ottiene anche un costruttore predefinito sintetizzato?
- 13. Perché PHP non ha un costruttore predefinito?
- 14. Perché una classe può avere un membro statico di se stesso, ma non un membro non statico?
- 15. sovraccarico operatore di assegnazione copia per uno struct membro di un non-modello di tipo struct
- 16. Una classe base può determinare se una classe derivata ha sovrascritto un membro virtuale?
- 17. Puntatore a un membro di dati privato di una classe
- 18. Perché un membro di dati statici non può essere inizializzato?
- 19. Unboxing si verifica quando viene fatto riferimento a un membro di tipo valore di una classe?
- 20. Operatore di assegnazione di sovraccarico C++
- 21. Inizializzazione un membro di dati constexpr statico della classe base utilizzando un membro di dati constexpr statico della classe derivata
- 22. Assegnazione ad una variabile membro std :: shared_ptr
- 23. Operatore di assegnazione del sovraccarico in C++
- 24. Come chiamare un membro dati della classe base se viene sovrascritto come una proprietà nella classe derivata?
- 25. Inizializzazione di un membro di riferimento con se stesso legale?
- 26. Utilizzo di un membro della classe come argomento predefinito per una funzione membro
- 27. C++: Posso rendere un operatore di assegnazione "esplicito"
- 28. Perché il costruttore predefinito è richiesto in una classe genitore se ha un costruttore argomento-edito?
- 29. Riferimento non definito a un membro statico
- 30. Perché Java non fornisce il costruttore predefinito, se la classe ha un costruttore parametrizzato?
In che modo verrà inizializzato tale riferimento? – Mat
Non è possibile _reassign_ un riferimento. Assegnare semplicemente modificherebbe l'oggetto di riferimento, che potrebbe non essere quello che vuoi. –