No, il tipo di reso non ha importanza.†
Lo standard C++ non impone alcun requisito per il tipo di reso per le funzioni membro speciale di assegnazione copia che si dichiara. Deve solo essere un operator=()
che accetti "esattamente un parametro di tipo X
, X&
, const X&
, volatile X&
o const volatile X&
". †† Pertanto, void operator=(const NonCopyable&);
è ancora un operatore di assegnazione copia (uno specificato dall'utente, per essere specifico).
Poiché in effetti è stato fornito il proprio operatore di assegnazione delle copie, verrà annullata la generazione dell'operatore di assegnazione delle copie predefinito. Ciò impone tutte le chiamate all'operatore di assegnazione delle copie di NonCopyable
da risolvere sul proprio, provocando l'impossibilità di compilare i tentativi di utilizzare l'operatore di assegnazione delle copie dal momento che è stato dichiarato private
.
class Foo : NonCopyable
{
};
int main()
{
Foo a;
Foo b;
// Compiler complains about `operator=(const NonCopyable&)`
// not accessible or something like that.
a = b;
}
E siccome non sarò mai in grado di utilizzare in realtà, non importa che non è esattamente l'operatore di assegnamento per copia canonica. Se provassi ad usare l'operatore di assegnazione delle copie, si tradurrebbe in un errore del compilatore, che è esattamente quello che vuoi.
† Naturalmente, non importa, stilisticamente parlando, se l'operatore di assegnazione copia in realtà fa qualcosa. In genere si desidera che gli operatori si comportino esattamente come quelli incorporati, pertanto restituire uno X&
è una buona pratica quando si esegue effettivamente l'assegnazione.
†† C++ standard: oggetti 12.8 classe Copia [class.copy]
Un utente-dichiarato copia assegnazione operatore X::operator=
è una funzione membro non-modello di non-statico classe X
con esattamente un parametro di tipo X
, X&
, const X&
, volatile X&
o const volatile X&
.
Nota anche che con C++ 11 puoi renderlo ancora più chiaro facendo 'void operator = (const NonCopyable &) = delete;' –