Frage

Es ist mir kürzlich aufgefallen dieses Mitglied funktioniert komplett Schatten freie Funktionen mit demselben Namen innerhalb der Klasse.Und damit meine ich, dass jede freie Funktion mit demselben Namen für die Überladungsauflösung überhaupt nicht berücksichtigt wird.Ich kann verstehen, warum es mit so etwas gemacht wird:

void f();

struct S
{
    void f();

    void g()
    {
        f(); // calls S::f instead of ::f
    }
};

wenn die Funktionen identische Signaturen haben, ist dies nur natürlich, da das Scoping von Variablen auf die gleiche Weise funktioniert.Aber warum eindeutige Aufrufe verbieten, bei denen die freie Funktion eine andere Signatur hat:

void f();

struct S
{
    void f(int x);

    void g()
    {
        f(); // fails to compile attempting to call S::f, which has wrong signature
    }
};

Ich frage nicht, wie man einen anruft beschattet freie Funktion innerhalb der Klasse.Was ich wissen möchte, ist die Begründung für dieses Design.

War es hilfreich?

Lösung

Bei der Suche nach nicht qualifizierten Namen wird jeweils nur ein Bereich berücksichtigt, und wenn die Suche in diesem Bereich keine Ergebnisse liefert, wird der nächsthöhere Bereich durchsucht.In Ihrem Fall nur SDer Geltungsbereich wird durchsucht.

Aber warum eindeutige Aufrufe verbieten, bei denen die freie Funktion eine andere Signatur hat:

Das Problem ist, dass namenssuche kümmert sich um nichts anderes als den Namen, die Kennung.Es ist völlig ahnungslos, dass Sie eine Funktion aufrufen möchten, es sieht nur eine Kennung.Die gleiche Namenssuche passiert, wenn Sie nur verwenden auto x = f;, und wenn Sie so darüber nachdenken, gibt es sehr gute Gründe, warum Sie nur einen sehr begrenzten Suchbereich wünschen.Alles andere würde den Benutzer nur überraschen.

Andere Tipps

Es gibt eine spezielle, sehr überraschende Regel (aber nicht für Ihr Beispiel an.p> generasacodicetagpre.

imo, das ist verrückt.

aber warum unambigiöse Anrufe verbieten, in denen die freie Funktion eine andere Unterschrift hat:

Namenssuche geschieht vor dem Überlastung der Auflösung:

    .
  • Wenn Lookup mehrdeutig ist, wird die Überlastung nicht erledigt.
  • Wenn keine tragfähige Funktion nach dem Namen Lookup gefunden wird, wird keine andere Lookup-Runde versucht.

Die -Regeln sind ausreichend komplex ohne "Feedback" zwischen Überlastung und Namenssuche.Ich würde die Vereinfachung vorschlagen (wie das Entfernen des Mitglieds versteckt die Namespace-Übernamensregel und das Entfernen mehrdeutiger Name-Lookup) und nicht komplexe.

Ich kann keine verbindliche Antwort geben (vielleicht erinnern sich einige an ein Zitat aus Design and Evolution of C++ oder war zu dieser Zeit tatsächlich im Komitee), aber meine erste Vermutung wäre, in Fällen, wie Sie zeigen, genau zu scheitern.Es ist leicht zu vergessen, wie viele Dinge zu einem bestimmten Zeitpunkt im Geltungsbereich sind.Außerdem kann die Überladungsauflösung sehr komplex sein und es kann Standardargumente und Konvertierungen geben.Also hätte ich in diesem Fall lieber den engsten Spielraum, um immer sicher zu sein, was genau aufgerufen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top