По 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
, объявленная и определенная в глобальной области, просто не найдена в случае кода выше?
Пожалуйста, отредактируйте свой вопрос, чтобы включить сообщение об ошибке. –