Me parece que el uso de espacios de nombres sin anclaje es solo un problema más adelante cuando alguien pone un nuevo espacio de nombres que tiene el mismo nombre que un espacio de nombres de nivel raíz y misteriosamente altera el significado de una gran cantidad de programas. Entonces, ¿por qué la gente siempre dice std::
en lugar de ::std::
? ¿De verdad quieren decir "Quiero usar lo que sea std
útil, no la raíz"?¿Por qué todos usan declaraciones de espacio de nombres sin anclaje (es decir, std :: not :: std: :)?
Aquí es un ejemplo de lo que quiero decir:
En Fred/foo.h:
#include <string>
namespace fred {
class Foo {
public:
void aPublicMember(const std::string &s);
};
} // end namespace fred
En Fred/Bar.h:
namespace fred {
namespace std { // A standard fred component
class string { // Something rather unlike the ::std::string
// ...
};
} // namespace std
class Bar {
public:
void aPublicMember(std::string &s);
};
} // namespace fred
En oops.cpp:
#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h" // Oops, the meaning of Foo is now different.
Eso es lo que la gente quiere, o soy Me falta algo?
Y tal vez usted diga que nunca debería nombrar un espacio de nombre std
. Y eso está muy bien, pero ¿qué pasa con algún otro espacio de nombres de nivel raíz? ¿Debería cualquier espacio de nombre de nivel raíz que alguna vez se define en algún lugar estar siempre fuera de los límites para un nombre de espacio de nombres secundario?
Para aclarar, no consideraré ninguna respuesta que me diga que std
es especial porque lo acabo de usar como ejemplo. Estoy hablando de un problema general, y estoy usando std
como un accesorio para ilustrarlo, aunque admito que es un apoyo bastante sorprendente.
Voy a aceptar esta porque es lo más cercano a una respuesta real. Creo que el otro simplemente votó más alto porque era más divertido. :-) Sospecho que debería haber elegido un ejemplo diferente, o no hice la pregunta de la manera en que lo hice. – Omnifarious