Bereichsauflösungsoperator ohne Bereich

Lesezeit: 2 Minuten

Was ist der Zweck des Bereichsauflösungsoperators in C++, wenn er ohne Bereich verwendet wird? Zum Beispiel:

::foo();

Bereichsauflosungsoperator ohne Bereich
Kennzeichen

Es bedeutet globale Reichweite. Möglicherweise müssen Sie diesen Operator verwenden, wenn Sie widersprüchliche Funktionen oder Variablen im selben Bereich haben und Sie einen globalen verwenden müssen. Sie haben vielleicht etwas wie:

void bar();    // this is a global function

class foo {
    void some_func() { ::bar(); }    // this function is calling the global bar() and not the class version
    void bar();                      // this is a class member
};

Wenn Sie die globale bar()-Funktion innerhalb einer Klassenmitgliedsfunktion aufrufen müssen, sollten Sie ::bar() verwenden, um zur globalen Version der Funktion zu gelangen.

  • Warum wird es nicht kompiliert?

    – Leichtigkeitsrennen im Orbit

    14. Februar 2014 um 10:09 Uhr

  • Hier muss hinzugefügt werden, dass das, was Sie in einem anonymen Namensraum definieren, auch mit dem unären Bereichsoperator aufgerufen werden kann:

    – Trommel

    21. Juni 2017 um 12:33 Uhr

Bereichsauflosungsoperator ohne Bereich
Shafik Yaghmur

Ein Name, der mit beginnt Oszilloskopauflösungsoperator (::) wird im globalen Namespace nachgeschlagen. Wir können dies sehen, indem wir uns das ansehen Entwurf des C++-Standards Sektion 3.4.3 Qualifizierte Namenssuche Absatz 4 was sagt (Betonung von mir):

Ein Name, dem der unäre Gültigkeitsbereichsoperator :: (5.1) vorangestellt ist wird im globalen Geltungsbereich nachgeschlagen, in der Übersetzungseinheit, in der es verwendet wird. Der Name soll im Geltungsbereich des globalen Namensraums deklariert werden oder ein Name sein, dessen Deklaration aufgrund einer using-Direktive (3.4.3.2) im Geltungsbereich des globalen Geltungsbereichs sichtbar ist. Die Verwendung von :: ermöglicht es, auf einen globalen Namen zu verweisen, selbst wenn sein Bezeichner verborgen wurde (3.3.10).

Wie der Standard besagt, erlaubt uns dies, Namen aus dem globalen Namensraum zu verwenden das würde sonst ausgeblendet werdendas Beispiel aus dem verlinkten Dokument lautet wie folgt:

int count = 0;

int main(void) {
  int count = 0;
  ::count = 1;  // set global count to 1
  count = 2;    // set local count to 2
  return 0;
}

Der Wortlaut ist sehr ähnlich zurück zu N1804 Dies ist der früheste verfügbare Normentwurf.

Beachten Sie auch, dass die Namensauflösung vor der Überladungsauflösung erfolgt. Wenn es also etwas mit demselben Namen in Ihrem aktuellen Bereich gibt, wird es aufhören, nach anderen Namen zu suchen, und versuchen, sie zu verwenden.

void bar() {};
class foo {
    void bar(int) {};
    void foobar() { bar(); } // won't compile needs ::bar()
    void foobar(int i) { bar(i); } // ok
}

Wenn Sie bereits eine Funktion namens foo() in Ihrem lokalen Gültigkeitsbereich haben, aber auf die Funktion im globalen Gültigkeitsbereich zugreifen müssen.

Mein C++ ist rostig, aber ich glaube, wenn Sie eine Funktion im lokalen Bereich deklariert haben, wie z. B. foo() und eine im globalen Bereich, bezieht sich foo() auf die lokale. ::foo() bezieht sich auf das globale.

1646643615 442 Bereichsauflosungsoperator ohne Bereich
tschüss

bezieht sich auf den globalen Geltungsbereich

964610cookie-checkBereichsauflösungsoperator ohne Bereich

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy