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. .
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. –
@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. –
@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. –