Il problema chiave è che non si fornisce il costruttore di assegnazione . Di conseguenza, il compilatore genera un predefinita per voi: costruttore di assegnazione
X& X::operator =(const X& x){
this.member = x.member;
return *this;
}
L'impostazione predefinita accetta tipo di argomento come const X & in cui il const è un const basso livello vinto' t essere ignorato come const di livello superiore.
Il tuo codice X b = a
significa chiamare il costruttore predefinito. Ma il vostro argomento è di tipo a
volatili X (può essere convertito in volatili X & e const volatili X &) non può essere convertito in const X & implicitamente.
così si dovrebbe definire il proprio costruttore di incarico come
X& X::operator =(volatile const X&);
EDIT
Mi sconvolge che tanti ragazzi pensano che il costruttore di copia (oppure chiama copia di inizializzazione) è chiamato quando si utilizza l'operatore di assegnazione . Forse chiamarlo l'operatore di assegnazione non è comune. Tuttavia, quello che mi interessa è quale metodo viene chiamato.
è possibile fare riferimento a questo post: Copy constructors, assignment operators, and exception safe assignment e Default assignment operator
EDIT
ho commesso un errore in precedenza. X b = a
è solo un processo di inizializzazione. Nessun incarico è coinvolto Chiedere scusa per il mio messaggio di errore.
È necessario dichiarare 'b'as' volatile'. – 0x499602D2
Ma voglio una copia non volatile! – Eric
'volatile X &' non può essere convertito in 'const X &' perché i due qualificatori si contraddicono a vicenda:' const' dice "leggi una volta, non cambierà", mentre 'volatile' dice" leggi ogni volta, perché può cambiare". Deve esserci una regola intelligente nello standard C++ che proibisce di effettuare questa conversione implicitamente. – dasblinkenlight