2011-03-23 39 views

Respuesta

0

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.

+0

No veo cómo su segundo punto se relaciona con la pregunta. –

+0

La pregunta era si uno lo recomendaría y no lo hago por las razones que enumeré en mi segunda oración;) – filmor

+0

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 '::'. –

0

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.

4

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.

+1

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

+0

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

6

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

¿no sería más simple cambiar el nombre de la función, realmente: P? –

+1

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

+4

+1 para un ejemplo en el que ** tiene ** un motivo para usar el nombre std dentro de otro espacio de nombres. –

2

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 
} 
Cuestiones relacionadas