2013-08-08 5 views
1

Я хотел бы знать, необходимы ли полные квалификационные имена в библиотеке.Использование пространств имен в библиотеках

Например (я отступа пространств имен здесь для удобства чтения):

namespace A { 
    namespace B { 
     namespace C { 
      class Foo { ... }; 
     } // namespace C 

     ::A::B::C::Foo foo; 
     // or 
     C::Foo foo 
    } // namespace B 
    namespace D { 
     ::A::B::C::Foo foo; 
     // or 
     B::C::Foo foo 
    } // namespace D 
} // namespace A 

Я не в полной мере понять 3.4 главы стандарта C++, и я видел, что-то я не могу объяснить, в заголовке STL вектора (упрощено для удобства чтения):

namespace std { 
    template<.. 
    class reverse_iterator 
    { ... }; 

    template<.. 
    class vector { 
     typedef _STD reverse_iterator<const_iterator> const_reverse_iterator; 
     ... 
    } 
} 

вещи _STD расширяется до :: зОго :: .. но по моему пониманию имени искать, reverse_iterator бы посмотрел на в векторе первого, то в родительское пространство имен, которое является std. Как могло бы произойти столкновение?

вспомогательный вопрос: что было бы правилами поиска имени для имен в функциях шаблона с аргументами? Я думаю, что квалифицированный идентификатор будет смотреть непосредственно на имена, уже объявленные без ADL, но неквалифицированное имя будет делать ADL, я прав?

Заранее благодарю вас за ответы.

+0

Я всегда полностью квалифицирую свои пространства имен. Это не имеет никакого значения для компилятора, но он значительно облегчает понимание и навигацию кода, когда я возвращаюсь и смотрю на него еще несколько лет спустя. –

+0

Я делаю это иногда только для ясности, но мне было интересно узнать больше о глобальной квалификационной шкале :: A :: ... вместо A ::. У меня есть около 3 уровней пространств имен, которые слишком долго дают полностью квалифицированным именам, чтобы читаемость могла извлечь выгоду из ее ясности. – ThiSpawn

ответ

4

Вы правы, квалификация оказывается ненужной там.

Не пытайтесь выучить C++ из стандартного библиотечного кода, он должен быть написан в очень своеобразном стиле по различным причинам, который, вероятно, не относится к вам, включая обратную совместимость, переносимость, альтернативные конфигурации (например, отключение всех пространства имен для исторических компиляторов). Вполне возможно, что в некоторых конфигурациях _STD расширяется что-то другое, или, возможно, что это просто излишним (но безвредный.)

что бы правила поиска имен для имен в шаблоне функций с аргументами? Я думаю, что квалифицированный идентификатор будет смотреть непосредственно на имена, уже объявленные без ADL, но неквалифицированное имя будет делать ADL, я прав?

Да, ADL применяется только к неквалифицированным наименованиям.

Смежные вопросы