sirve que para namespace dev declarations c++ namespaces using-declaration

que - C++ usando la palabra clave



using declarations c++ (4)

¿Cuál es la diferencia entre estos dos usos del uso de palabras clave:

using boost::shared_ptr;

y

using namespace boost;


El primero se llama using declaration ;

El segundo se llama using directive .

Cotizando MSDN:

Observe la diferencia entre la directiva using y la declaración using:

La declaración de uso permite que un nombre individual sea usado sin calificación,

La directiva using permite que todos los nombres en un espacio de nombres se utilicen sin calificación.


El primero solo le permite usar el nombre shared_ptr sin el prefijo boost ::. El segundo le permite usar cualquiera y todos los nombres en el espacio de nombres de boost sin el prefijo boost ::. Algunas personas fruncen el ceño en este último, pero nunca me ha dado ningún problema.


using boost::shared_ptr;

Incluye solo el shared_ptr del espacio de nombres boost en su espacio de nombres actual. Esto significa que puede usar shared_ptr sin calificarlo con el boost espacio de nombres.

Se llama una declaración de uso .

using namespace boost;

Incluye todos los símbolos en el espacio de nombres de boost en su ámbito actual. Esto significa que puede usar todos los símbolos en el espacio de nombres de boost sin calificarlos con el boost espacio de nombres.

Se llama como usar directiva .

¿Por qué debería preferir siempre using declaration en lugar de using directive ?

Siempre es mejor usar el primero ( using declaration ) y evitar el segundo ( using directive ) porque el segundo causa la contaminación del espacio de nombres al traer un número potencialmente grande de nombres al espacio de nombres actual, muchos de los cuales son innecesarios. La presencia de los nombres innecesarios aumenta considerablemente la posibilidad de conflictos de nombres no deseados.

Para citar a Herb Sutter sobre el uso de la using directive :

Me parece útil pensar en una using directive como un ejército merodeador de bárbaros enloquecidos que siembran la destrucción indiscriminada dondequiera que pase, algo que por su mera presencia puede causar unintended conflicts, incluso cuando crees que estás aliado.


  • using namespace boost hace que todos los nombres en el espacio de nombres de boost visibles sin calificación
  • using boost::shared_ptr solo hace que shared_ptr sea ​​visible sin calificación.