Мне кажется, что использование незашифрованных пространств имен просто вызывает проблемы позже, когда кто-то помещает новое пространство имен, которое имеет то же имя, что и пространство имен корневого уровня, и загадочно изменяет значение целого ряда программ. Итак, почему люди всегда говорят std::
вместо ::std::
. Неужели они действительно хотят сказать: "Я хочу использовать любую std
, а не корневую."?
Вот пример того, что я имею в виду:
В fred/Foo.h:
#include <string>
namespace fred {
class Foo {
public:
void aPublicMember(const std::string &s);
};
} // end namespace fred
В 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
В oops.cpp:
#include <string>
#include "fred/Bar.h"
#include "fred/Foo.h" // Oops, the meaning of Foo is now different.
Это то, чего хотят люди, или я чего-то не хватает?
И, возможно, вы говорите, что вы просто не должны называть пространство имен std
. И это все хорошо и хорошо, но как насчет другого пространства имен корневого уровня? Должно ли любое пространство имен корневого уровня, какое-либо когда-либо определяемое в любом месте, всегда должно быть запрещено для имени под-имен?
Чтобы уточнить, я не буду рассматривать какой-либо ответ, который говорит мне, что std
является особенным, потому что я просто использовал его в качестве примера. Я говорю об общей проблеме, и я использую std
в качестве опоры, чтобы проиллюстрировать ее, хотя я признаю ее довольно поразительной опорой.