sirve - ¿Qué significa "leading" en "usar namespace:: X" en C++?
using declarations c++ (4)
¿Alguien puede explicarme la diferencia entre los siguientes usos del espacio de nombres?
using namespace ::layer::module;
y
using namespace layer::module;
¿Qué causa la layer
adicional ::
before?
El segundo caso podría ser el X::layer::module
donde el using namespace X
ya ha sucedido.
En el primer caso, el prefijo ::
significa "compilador, no seas inteligente, comienza en el espacio de nombres global ".
Habría una diferencia si se usara en un contexto como:
namespace layer {
namespace module {
int x;
}
}
namespace nest {
namespace layer {
namespace module {
int x;
}
}
using namespace /*::*/layer::module;
}
Con la inicial ::
la primera x
sería visible después de la directiva using, sin ella el segundo nest::layer::module
x
inside nest::layer::module
haría visible.
Se denomina búsqueda de nombre calificado en C ++.
Significa que el espacio de nombre de capa al que se hace referencia es el que está fuera del espacio de nombre global, en lugar de otro espacio de nombre anidado llamado capa.
Para los fanáticos de Standerdese:
$ 3.4.3 / 1
"El nombre de una clase o miembro de espacio de nombres se puede consultar después de que el operador de resolución de ámbito (5.1) aplicó a un especificador de nombre anidado que nomina su clase o espacio de nombres. Durante la búsqueda de un nombre que preceda a la resolución :: alcance se ignoran los nombres de operador, objeto, función y enumerador. Si el nombre encontrado no es un nombre de clase (cláusula 9) o un nombre de espacio de nombres (7.3.1), el programa está mal formado ".
Un líder ::
refiere al espacio de nombre global . Cualquier identificador calificado que comience con a ::
siempre se referirá a algún identificador en el espacio de nombres global. La diferencia es cuando tienes las mismas cosas en el espacio de nombres global y local.
namespace layer { namespace module {
void f();
} }
namespace blah {
namespace layer { namespace module {
void f();
} }
using namespace layer::module // note: no leading ::
// refers to local namespace layer
void g() {
f(); // calls blah::layer::module::f();
}
}
namespace blubb {
namespace layer { namespace module {
void f();
} }
using namespace ::layer::module // note: leading ::
// refers to global namespace layer
void g() {
f(); // calls ::layer::module::f();
}
}