Questo è discusso in "Effective C++" di Scott Meyer. La ragione per cui questo è ambiguo è che volevano assicurarsi che la semplice modifica della visibilità di un membro non avrebbe cambiato il significato del codice già esistente altrove.
Altrimenti, supponiamo che la tua classe C fosse in un'intestazione da qualche parte. Se avessi un membro C (int) privato, il codice che hai presentato chiamerebbe C (float). Se, per qualche motivo, il membro C (int) è stato reso pubblico, il vecchio codice lo chiamerebbe improvvisamente, anche se né il codice vecchio né la funzione chiamata erano cambiati.
EDIT: Ulteriori motivi:
Peggio ancora, si supponga di avere le seguenti 2 funzioni:
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
Queste due funzioni potrebbe chiamare funzioni diverse a seconda che sia foo o bar è stato dichiarato come amico di C, o se A o B eredita da esso. Avere identico chiamata di codice diverse funzioni è spaventoso.
(Questo è probabilmente non è così messo in discussione di Scott Meyer, ma questa è l'idea.)
fonte
2009-03-13 20:18:38
Hmm, questo sembrava un grande spiegazione All'inizio. Ma ... è ancora possibile creare la classe _without_ un int-ctor, poi dopo _add_ quel vecchio codice così vecchio inizia improvvisamente a chiamare il nuovo membro ... Quindi questa protezione crea solo un falso senso di sicurezza. –
Buon punto. Aggiungerò di più –