2016-08-01 8 views
1

По unqualified lookup in cppreference.com:Имен функций в глобальном масштабе namepsace не могут быть найдены

Для имени, используемого в определении функции, либо в своем теле или как часть аргумента по умолчанию, когда функция является членом из объявленного или глобального пространства имен, блок, в котором используется это имя, выполняется поиск до использования имени, затем поиск блока до начала этого блока и т. д. до тех пор, пока он не достигнет блока, который является телом функции. Тогда пространство имен, в котором функция объявлена ​​не ищется до определения (не обязательно декларация) функции, которая использует имя, затем ограждающие пространства имен и т.д.

Так я думал, что имена функций определены в глобальная область пространства имен должна быть найдена просто через неквалифицированный поиск. Однако, следующий фрагмент кода не может скомпилировать:

#include <iterator> 
#include <iostream> 

namespace AA{ 
    class AAA{}; 
}; 

using namespace AA; 

int begin(AAA){ 
    return 3; 
} 

int main(){ 
    using std::begin; // to add std::begin in the name candidate set 

    auto x = AAA(); 
    return begin(x); // compile error, ::begin cannot be found 
} 

И GCC (6.1.1) и Clang (3.8.0) сообщает о том же error.

И либо я удаляю оператор using std::begin, либо переведу class AAA в namespace AA, эта программа успешно скомпилирована. Поэтому я думаю, что как только мой begin будет найден с помощью поиска по имени, он будет выбран с помощью разрешения перегрузки. Поэтому возникает вопрос: почему моя функция begin, объявленная и определенная в глобальной области, просто не найдена в случае кода выше?

+0

Пожалуйста, отредактируйте свой вопрос, чтобы включить сообщение об ошибке. –

ответ

1

Обратите внимание, что unqualified name lookup остановится, если имя найдено (в некоторой области), то дальнейшие области поиска не будут найдены. Для вашего образца кода имя begin будет найдено в области функций main() (что относится к std::begin), тогда поиск имен прекращается, поэтому имя в глобальной области не будет проверено.

..., поиск имени проверяет области действия, как описано ниже, до тех пор, пока не найдет хотя бы одно объявление любого вида, после чего поиск прекратится и дальнейшие области не будут проверены.

Из цитаты вы публикуемую (выделено мной):

и т.д., пока не достигнет блока, который является телом функции. (имя поиск остановится здесь, то есть в блоке основного() функция тела)

Тогда пространство имен ... (Дальнейшее пространства имен не будет поиск.)

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

  • Нет связанных вопросов^_^