соглашение о кодировании корневого пространства имен в C ++ - PullRequest
7 голосов
/ 23 марта 2011

Не могли бы вы порекомендовать префикс глобальных пространств имен с ::?(например ::std::cout вместо std::cout) Почему?Разве быстрее разбирать компилятор C ++?

Спасибо.

Ответы [ 5 ]

6 голосов
/ 23 марта 2011

Делайте это только для устранения неоднозначности.

У меня есть фрагмент кода, где это необходимо, поскольку я нахожусь в пространстве имен X, в котором есть функция для стандартного отклонения - std. Всякий раз, когда я хочу получить доступ к пространству имен std, мне нужно использовать ::std, потому что в противном случае компилятор будет думать, что я имею в виду указанную функцию.

Конкретный пример:

namespace X {
    double std(::std::vector<double> const& values) { … }

    void foo(::std::vector<double> const& values) {
        ::std::cout << std(values) << ::std::endl;
    }
}
3 голосов
/ 23 марта 2011

Это не имеет никакого отношения к скорости разбора. C ++ использует Поиск имени в зависимости от аргумента - Koenig Lookup , и когда вам нужно убедиться, что компилятор использует символ из глобального корневого пространства имен, вы добавляете к нему префикс ::. Если вы этого не сделаете, компилятор может также использовать определения функций из других пространств имен, когда сочтет нужным (в зависимости от метода поиска).

Итак, лучше этого не делать, если вам не нужно.

1 голос
/ 23 марта 2011

Вам не нужно, так как компилятор будет

а) все равно найди б) вывести ошибку, если есть какие-либо неоднозначности, например

namespace foo
{
  int test()
  {
    return 42;
  }
}

namespace bar
{
  namespace foo
  {
    int test()
    {
      return 42;
    }
  }
}

int main()
{
  using namespace bar;
  return foo::test(); // error, could be ::foo::test or ::bar::foo::test
}
0 голосов
/ 23 марта 2011

Я не вижу веских причин для этого. Это делает код менее читабельным, и его следует использовать только тогда, когда вы явно должны указать компилятору использовать корневое пространство имен. Например, когда есть неясности.

0 голосов
/ 23 марта 2011

Не делай этого.Он загромождает ваш код и отключает возможность реализовать самодельный вариант используемых вами функций.

...