Esto se trata en "Effective C++" de Scott Meyer. La razón por la cual esto es ambiguo es que querían asegurarse de que el simple hecho de cambiar la visibilidad de un miembro no cambiara el significado del código ya existente en otra parte.
De lo contrario, supongamos que su clase C estaba en un encabezado en alguna parte. Si tuviera un miembro C (int) privado, el código que presente llamaría C (float). Si, por alguna razón, el miembro C (int) se hizo público, el código anterior llamaría repentinamente a ese miembro, aunque ni el código antiguo ni la función a la que llamaba habían cambiado.
EDIT: Más razones:
Peor aún, supongamos que existen los siguientes 2 funciones:
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
Estas dos funciones se podrían llamar a diferentes funciones dependiendo de si cualquiera foo o la barra fue declarado como amigo de C, o si A o B heredan de él. Tener idéntica llamadas de código diferentes funciones es aterrador.
(Eso es probablemente no tan bien como la discusión puso de Scott Meyer, pero esa es la idea.)
Hmm, esto parecía una gran explicación primero. Pero ... aún es posible crear la clase _sin_un int-ctor, y luego _add_ ese ctor para que el código viejo empiece a llamar al nuevo miembro ... Así que esta protección solo crea una falsa sensación de seguridad. –
Buen punto. Añadiré más. –