最近、メンバー関数がクラス内で同じ名前のフリー関数を完全に隠していることに気付きました。そして完全に言うと、同じ名前のフリー関数はすべて、オーバーロード解決の対象とはまったく見なされないということです。なぜそれがこのようなもので行われるのか理解できます:
void f();
struct S
{
void f();
void g()
{
f(); // calls S::f instead of ::f
}
};
関数が同一のシグネチャを持っている場合、変数のスコープが同じように機能するため、これは当然のことです。しかし、free 関数が次のように異なるシグネチャを持つ明確な呼び出しを禁止する理由は次のとおりです。
void f();
struct S
{
void f(int x);
void g()
{
f(); // fails to compile attempting to call S::f, which has wrong signature
}
};
クラス内からシャドウされたフリー関数を呼び出す方法を尋ねているのではありません。私が知りたいのは、このデザインの背後にある理論的根拠です。