2008-09-16 5 views

Répondre

54

Cela signifie une portée globale. Vous devrez peut-être utiliser cet opérateur lorsque vous avez des fonctions ou des variables en conflit dans la même portée et que vous devez utiliser une portée globale. Vous pourriez avoir quelque chose comme:

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 
}; 

Si vous devez appeler la fonction barre globale() dans une fonction de membre de classe, vous devez utiliser :: bar() pour obtenir la version globale de la fonction.

+2

Pourquoi ne compilera-t-il pas? –

+1

[Apparemment, il compile] (http://ideone.com/tUVXrb) –

+0

Vous devez ajouter ici que ce que vous définissez dans un espace de noms anonyme peut également être appelé à l'aide de l'opérateur de portée unaire: – DrumM

1

se référant à la portée globale

+4

-1: Extrêmement paresseux! –

2

Si vous avez déjà une fonction foo() nom dans votre champ d'application locale, mais vous devez accéder à celui de la portée globale.

1

Mon C++ est rouillé mais je crois que si vous avez une fonction déclarée dans la portée locale, comme foo() et une à portée globale, foo() fait référence à la fonction locale. :: foo() se référera au global.

4

Notez également que cette résolution de nom se produit avant la résolution de surcharge. Donc, s'il y a quelque chose avec le même nom dans votre portée actuelle, alors il va arrêter de chercher d'autres noms et essayer de les utiliser.

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

Un nom qui commence par le scope resolution operator (::) est recherché dans l'espace de noms global. On peut le voir en regardant la section draft C++ standard3.4.3Nom qualifié de recherche paragraphe qui dit (de Souligné par):

Un nom préfixé par l'opérateur de portée unaire :: (5.1) est recherché dans la portée globale, dans l'unité de traduction où il est utilisé. Le nom doit être déclaré dans la portée de l'espace de noms global ou doit être un nom dont la déclaration est visible dans la portée globale en raison d'une directive using (3.4.3.2). L'utilisation de :: permet de faire référence à un nom global même si son identifiant a été caché (3.3.10).

Comme les états standards ce qui nous permet d'utiliser des noms de l'espace de noms global that would otherwise be hidden, l'exemple du document lié est comme suit:

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; 
} 

Le libellé est très similaire remontant à N1804 qui est le premier projet de norme disponible.