2015-07-18 2 views
4

Я пытаюсь понять, почему эта программа не дает имя-поиску неоднозначности для I:Имя-поиск неоднозначность несогласованность

namespace X { int i = 1; } 

namespace Q {  
    namespace P {   
     int i = 2; 
     using namespace X; 
    } 

    using namespace P; 

    int l = i; 
} 

int main() {} 

Если мы изменим это так мы получаем имя-поиск двусмысленности:

namespace X { int i = 1; } 

namespace P {   
    int i = 2; 
    using namespace X; 
} 

using namespace P; 

int l = i; 

int main() {} 

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

Я попытался с 3-мя различными компиляторами:

Полностью дают результаты, изложенные в этом письме, и я пытаясь выяснить, почему.

Может ли кто-нибудь объяснить поведение в терминах стандарта C++? Я не понимаю этого.

+2

Разве это не ответили на std-обсуждение? https://groups.google.com/a/isocpp.org/d/msg/std-discussion/7K4p4FCdq6o/9bDtklvVzZgJ – dyp

+1

С другой стороны, это правильный вопрос о SO, но, вероятно, дубликат. – dyp

+2

Связанный/дубликат: http://stackoverflow.com/q/10741428/ – dyp

ответ

1

В первой программе, используемой переменной i определен в пространстве имен P, так как с помощью директивы

using namespace X; 

места деклараций о X в глобальном пространстве имен (общий namepsace для X и P). Таким образом, объявление i в P (точнее, в Q из-за другого с помощью директивы) скрывает объявление X::i в глобальном пространстве имен.

от стандарта C++ (3.4.1 негодного поиск имени)

2 Заявления из пространства имен, выдвинутых с помощью директивы- становится видимым в пространстве имен заключени с помощью директивы; см. 7.3.4.

Таким образом, мы имеем для первой программы

namespace X { int i = 1; } 

namespace Q {  
    namespace P {   
     int i = 2; 
     using namespace X; // 1 
    } 

    using namespace P; // 2 

    int l = i; 
} 

что вшита пространство имен для использования директивы # 1 глобальное пространство имен и пространство имен вшита для использования директивы # 2 является namepsace Q.

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

//... 
using namespace X; 
//... 
using namespace P; 
Смежные вопросы