Почему делает все используют снятые с якоря объявления пространства имен (т.е. станд.:: нет:: станд.::)?

Используйте Инструментарий развертывания deployJava.js (хотя это гарантирует минимальную версию, а не определенную версию)

28
задан Omnifarious 2 November 2009 в 15:57
поделиться

8 ответов

Практическая причина использования незакрепленных пространств имен состоит в том, что обычно достаточно одного уровня пространств имен. Когда это не так, для деталей реализации обычно используется второй уровень. И, наконец, даже при использовании нескольких уровней они обычно неявно указываются на корневом уровне. т.е. даже внутри пространства имен ns1 , вы обычно будете обращаться к ns1 :: ns2 :: foo вместо ns2 :: foo или :: ns1: : ns2 :: foo .

Итак, по этим трем причинам форма :: ns1 в обычных случаях является избыточной. Единственный случай, когда я рассмотрел бы это, - это отправка в Boost, потому что как автор Boost я не знаю, где будет использоваться мое программное обеспечение.

20
ответ дан 28 November 2019 в 02:37
поделиться

почему люди всегда говорят std ::

Не всегда. Я использую строку и используя :: std :: string . Так что ничего страшного, если будет fred :: std :: string , потому что я все еще использую std :: string . В небольших cpp-файлах это может быть даже с использованием namespace :: std . Пример:

#include <iostream>
using ::std::string;
//using namespace ::std; // good for small cpp-files

int main()
{
  string s = "sometext"; // no leading ::std
}

вы просто никогда не должны давать имя пространству имен std

Да, вы не должны давать имя std пользовательскому пространству имен.

8
ответ дан 28 November 2019 в 02:37
поделиться

Итак, почему люди всегда говорят std :: вместо :: std ::

Вероятно потому, что из-за этого у них никогда не возникало проблем с двусмысленностью.

В том же духе: мне никогда не приходилось включать слово «земля» в свой адрес, и я не собираюсь .

Вы должны где-то провести черту, и это разумное предположение, что другие не будут создавать свои собственные пространства имен std, или, по крайней мере, библиотека, которая сделает это, не будет очень популярна. :)

37
ответ дан 28 November 2019 в 02:37
поделиться

Хорошо, вы говорите, что std - это только пример. Но мне кажется, что ваш вопрос применим только к случаю, когда кто-то делает что-то столь же злое, как переопределение std .

Позвольте мне привести еще один пример:

namespace logging
{
    // Logs to local file
}

namespace server
{
    namespace logging
    {
        // Logs to remote destination
    }
}

namespace client
{
    namespace logging
    {
        // Logs to local file and to screen
    }
}

В данном случае без добавления :: приводит к поведению по умолчанию.

3
ответ дан 28 November 2019 в 02:37
поделиться

Это настолько искусственно:

namespace fred {
namespace std {  // A standard fred component

class string { // Something rather unlike the ::std::string
   // ...
};

} // namespace std
} // namespace fred

Этот Фред не сможет объяснить, почему он сделал это всей команде.

Чтобы ответить на ваш вопрос: сначала люди пропускают ":: "потому что это привычка, которая экономит время, и потому что легче ожидать, что когда пространство имен используется где-либо, тогда такое имя будет абсолютным, а не относительным.

3
ответ дан 28 November 2019 в 02:37
поделиться

В случае std я бы не стал предполагать какое-либо другое пространство имен с тем же именем, теми же классами, но другим значением.

В других случаях ведущий :: просто выглядит некрасиво и затрудняет чтение кода (на мой взгляд). Конфликты пространств имен слишком редки, чтобы ставить :: перед всем.

2
ответ дан 28 November 2019 в 02:37
поделиться

Точно так же, как имена с префиксом _ зарезервированы, считайте std :: зарезервированным.

1
ответ дан 28 November 2019 в 02:37
поделиться

В глобальном пространстве имен написано много кода. Если кто-то действительно переопределяет :: std ::, не имеет значения, как вы на него ссылаетесь в таком коде.

Кроме того, ваш сценарий маловероятен, и его легко обойти. Во-первых, с тех пор, как существовало «std», существовало соглашение, что вы не используете это имя. Во-вторых, если вы встретите пакет, который определяет пространство имен 'std', вы просто сделаете следующее:

#include <package_name.hpp>

namespace package_name {
  using namespace std;
}

namespace my_app {
  class my_class : public package_name::class_of_something {};
}

Или что-то подобное. Возможно, вам придется явно указать :: std как std. Я хочу сказать следующее: люди постоянно используют незакрепленный 'std ::', потому что даже самые худшие последствия не имеют большого значения и маловероятны.

2
ответ дан 28 November 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: