Как правило, разница между ::any_name
а также any_name
должно быть ясно. Если предшествует ::
имя всегда и только ищется в глобальном пространстве имен.
Мне было интересно, однако, есть ли технический(*) разница, учитывая Пространство имен что я уже знаю, чтобы быть верхний уровень (т.е. непосредственно под глобальным пространством имен) и где Я знаю, что нет второго (вложенного) пространства имен (или любого имени) с таким же именем.
Например, есть ли разница между использованием ::std::string
против std::string
?
(*) Читаемость, стиль и вопросы обслуживания в стороне.
«Например, есть ли разница между использованием :: std :: string и std :: string?»
Подумай о такой странной ситуации
LegacyString.hpp
namespace Legacy {
namespace std {
class string {
// ...
};
}
}
#include <string>
#include "LegacyString.hpp"
using namespace Legacy;
В этом случае это, безусловно, будет иметь значение, если вы скажете ::std::string
или просто std::string
в следующем коде.
И да, как также указано в вашем другой вопрос принят ответ, это вполне законно, чтобы назвать любую конструкцию, будь то namespace
, class
, struct
, typedef
, так далее. std
.
Что касается вашего вопроса правок:
«и откуда я знаю, что нет второго (вложенного) пространства имен (или любого имени) с тем же именем».
Если вы знаете, что это так, обе формы, конечно, эквивалентны. Как вы упомянули, разрешение пространств имен заканчивается на глобальном уровне и будет разрешаться правильно без префикса. ::
,
ИМХО, как правило, мы полагаемся, что, по крайней мере, никто не что глупо, назвать любую конструкцию std
на самом деле. Но процитировать Эйнштейна:
«Две вещи бесконечны: вселенная и человеческая глупость; и я не уверен во вселенной».