¿Recomendaría prefijar los espacios de nombres globales con ::
? (por ejemplo, ::std::cout
en lugar de std::cout
) ¿Por qué? ¿Es más rápido analizar el compilador de C++?convención de codificación del espacio de nombres raíz en C++
Gracias.
¿Recomendaría prefijar los espacios de nombres globales con ::
? (por ejemplo, ::std::cout
en lugar de std::cout
) ¿Por qué? ¿Es más rápido analizar el compilador de C++?convención de codificación del espacio de nombres raíz en C++
Gracias.
No haga eso. Agrupa el código y deshabilita la opción de implementar una variante hecha a sí misma de las funciones que está utilizando.
No veo ninguna buena razón para hacer esto. Hace que el código sea menos legible, y solo debe usarse cuando explícitamente debe decirle al compilador que use el espacio de nombres raíz. Como cuando hay ambigüedades.
No tiene nada que ver con la velocidad de análisis. C++ usa Argument-dependent name lookup - Koenig Lookup y cuando tiene que asegurarse de que el compilador usa el símbolo del espacio de nombres raíz global, lo prefija con ::
. Si no lo hace, el compilador también podría usar definiciones de funciones de otros espacios de nombres cuando lo considere oportuno (dependiendo del método de búsqueda).
Por lo tanto, es mejor no hacerlo a menos que sea necesario.
ADL se refiere al hecho de que al buscar una llamada de función * no calificada *, los espacios de nombres de los argumentos se agregarán al conjunto de candidatos, y no tiene nada que ver con ningún identificador calificado, que es de lo que se trata la pregunta: llamadas calificadas vs. llamadas totalmente calificadas (incluido el espacio de nombres raíz). –
ADL se aplica a la búsqueda de nombres de todas las llamadas a funciones no calificadas. @trenki tiene razón en que usar :: cambia significativamente la búsqueda de nombres. A menudo a lo que no se quiere. –
Haga esto solo para desambiguar.
Tengo un código donde es necesario ya que estoy en un espacio de nombres X
que tiene una función para una desviación estándar - std
. Cuando quiera acceder al espacio de nombre std
, necesito usar ::std
porque de lo contrario el compilador pensará que me refiero a dicha función.
Ejemplo concreto:
namespace X {
double std(::std::vector<double> const& values) { … }
void foo(::std::vector<double> const& values) {
::std::cout << std(values) << ::std::endl;
}
}
¿no sería más simple cambiar el nombre de la función, realmente: P? –
@MatthieuM Esa es la solución incorrecta. Nombrar funciones ya es bastante difícil. El nombre de la función es * correcto * ("std" es la abreviatura más extendida para "desviación estándar") y no debe * cambiarse para evitar los conflictos de nombres. –
+1 para un ejemplo en el que ** tiene ** un motivo para usar el nombre std dentro de otro espacio de nombres. –
que no es necesario que, como el compilador
a) Encuentre todos modos b) Salida de un error si hay algún ambiguations, como
namespace foo
{
int test()
{
return 42;
}
}
namespace bar
{
namespace foo
{
int test()
{
return 42;
}
}
}
int main()
{
using namespace bar;
return foo::test(); // error, could be ::foo::test or ::bar::foo::test
}
No veo cómo su segundo punto se relaciona con la pregunta. –
La pregunta era si uno lo recomendaría y no lo hago por las razones que enumeré en mi segunda oración;) – filmor
En ese caso, se equivoca: no es así. El uso de un espacio de nombres explícito (ya sea prefijado por el calificador de espacio de nombres global '::' o no) * siempre * imposibilita el uso de una variante de la función hecha a sí misma (a menos que esté especializado 'std :: swap'). Es completamente irrelevante si el espacio de nombres tiene el prefijo '::'. –