Есть ли разница между квалифицированным :: toplevel_namespace и неквалифицированным toplevel_namespace?

Как правило, разница между ::any_name а также any_name должно быть ясно. Если предшествует :: имя всегда и только ищется в глобальном пространстве имен.

Мне было интересно, однако, есть ли технический(*) разница, учитывая Пространство имен что я уже знаю, чтобы быть верхний уровень (т.е. непосредственно под глобальным пространством имен) и где Я знаю, что нет второго (вложенного) пространства имен (или любого имени) с таким же именем.

Например, есть ли разница между использованием ::std::string против std::string?


(*) Читаемость, стиль и вопросы обслуживания в стороне.

1

Решение

«Например, есть ли разница между использованием :: 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 на самом деле. Но процитировать Эйнштейна:

«Две вещи бесконечны: вселенная и человеческая глупость; и я не уверен во вселенной».

3

Другие решения


По вопросам рекламы [email protected]