これについては、Scott Meyer による「Effective C++」で説明されています。これがあいまいである理由は、メンバーの可視性を単に変更しても、他の場所にある既存のコードの意味が変わらないようにしたかったからです。
それ以外の場合は、C クラスがどこかのヘッダーにあるとします。プライベート C(int) メンバーがある場合、提示するコードは C(float) を呼び出します。何らかの理由で C(int) メンバーが公開された場合、古いコードもそれが呼び出す関数も変更されていないにもかかわらず、古いコードは突然そのメンバーを呼び出します。
編集:その他の理由:
さらに悪いことに、次の 2 つの関数があるとします。
C A::foo()
{
return C(1.0);
}
C B::bar()
{
return C(1.0);
}
これら 2 つの関数は、foo または bar が C のフレンドとして宣言されているかどうか、または A または B がそれを継承しているかどうかに応じて、異なる関数を呼び出すことができます。同じコードで異なる関数を呼び出すのは恐ろしいことです。
(これはおそらく Scott Meyer の議論ほど適切ではありませんが、それがアイデアです。)