2011-02-07 21 views

Respuesta

3

El "::" inicial se refiere al espacio de nombre global. Supongamos que dice namespace foo { .... Entonces std::Bar se refiere a foo::std::Bar, mientras que ::std::Bar se refiere a std::Bar, que es probablemente lo que el usuario quiso decir. Por lo tanto, incluir siempre la inicial "::" puede protegerlo de referirse al espacio de nombres incorrecto, si no está seguro de en qué espacio de nombres se encuentra actualmente.

+1

Sin embargo, std :: vector solo se referirá a foo :: std :: vector si realmente existe. ¡Altamente improbable! De lo contrario, encontrará :: std :: vector de todos modos. –

+0

@Bo: No. Por ejemplo, en el ejemplo que presento a continuación, si eliminó la definición de 'ns :: std :: vector', la declaración de' v1' en 'ns :: f()' fallaría. –

+0

@James: OK, si realmente tiene un espacio de nombre local estándar sin un vector, el compilador le dirá que falta. Esta no es una buena razón para ** usar ** siempre :: delante de todo. Si no tiene un std de espacio de nombre local, el std :: vector normal se encontrará de todos modos, incluso si se encuentra en otro espacio de nombres. –

3

Este siempre toma la vector de la librería estándar. std::vector bien podría ser mycompany::std::vector si el código donde lo uso está en el espacio de nombres mycompany.

+1

Así que los medios :: "el principio del árbol de espacio de nombres"? – Tom

+0

Sí. Los comentarios deben tener al menos 15 caracteres de largo. – Oswald

1

Comenzar con :: significa restablecer el espacio de nombres al espacio de nombres global. Puede ser útil si intentas luchar contra alguna ambigüedad en tu código.

17

Esto califica completamente el nombre, de modo que solo la plantilla vector en se usa el espacio de nombre std en el espacio de nombres global. Básicamente significa:

{global namespace}::std::vector<myclass> myvec; 

No puede haber una diferencia cuando se tiene entidades con el mismo nombre en diferentes espacios de nombres. Para un simple ejemplo de cuándo esto podría importar, considere:

#include <vector> 

namespace ns 
{ 
    namespace std 
    { 
     template <typename T> class vector { }; 
    } 

    void f() 
    { 
     std::vector<int> v1; // refers to our vector defined above 
     ::std::vector<int> v2; // refers to the vector in the Standard Library 
    }   
}; 

Dado que no se le permite definir sus propias entidades en el espacio de nombres std, se garantiza que siempre habrá ::std::vector referirse al contenedor biblioteca estándar. std::vector podría referirse a otra cosa. .

+0

Parece que también habría un problema, incluso si 'ns :: std' no declara un vector. – UncleBens

+0

@UncleBens: un excelente punto. Se encontraría el espacio de nombres ':: ns :: std' y si no contenía una entidad llamada' vector', la búsqueda del nombre fallaría. –

+0

Buena respuesta. Yo agregaría que std no es una gran opción para casos de uso normal. Por lo general, daría lugar a confusión en la parte del usuario final. – Francesco

3

Tomando un ejemplo -

int variable = 20 ; 

void foo(int variable) 
{ 

    ++variable;  // accessing function scope variable 
    ::variable = 40; // accessing global scope variable 
} 
Cuestiones relacionadas