Ceci est discuté dans "Effective C++" par Scott Meyer. La raison pour laquelle cela est ambigu est qu'ils voulaient s'assurer que changer simplement la visibilité d'un membre ne changerait pas la signification du code déjà existant ailleurs.
Sinon, supposons que votre classe C se trouve dans un en-tête quelque part. Si vous avez un membre C (int) privé, le code que vous présentez appellera C (float). Si, pour une raison quelconque, le membre C (int) était rendu public, l'ancien code appellerait soudainement ce membre, même si ni l'ancien code ni la fonction qu'il appelait n'avaient changé.
EDIT: raisons plus:
Pire encore, supposons que vous aviez les 2 fonctions suivantes:
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
Ces deux fonctions peuvent appeler différentes fonctions selon que ce soit foo ou bar a été déclaré comme ami de C, ou si A ou B en hérite. Ayant identique code appel différentes fonctions est effrayant.
(C'est probablement pas aussi bien mis en discussion de Scott Meyer, mais c'est l'idée.)
Hmm, cela semblait être une bonne explication en premier. Mais ... il est toujours possible de créer la classe _without_ un int-ctor, puis plus tard _add_ que ctor si ancien code commence soudainement à appeler le nouveau membre ... Donc cette protection crée seulement un faux sentiment de sécurité. –
Bon point. J'ajouterai plus. –