Путаница с поиском имени функции - PullRequest
2 голосов
/ 23 апреля 2020

Меня смущают некоторые правила в стандарте. Я приведу их здесь:

[basi c .lookup.argdep] :

Пусть X будет поисковым набором, созданным безусловный поиск , и пусть Y будет набором поиска, созданным зависимым от аргумента поиском (определенным следующим образом).

Таким образом, приведенное выше предложение означает, что набор X создан с помощью безусловного поиска . Затем мы рассмотрим правила безусловного поиска :

[basi c .lookup.unqual] :

Во всех в случаях, перечисленных в [basi c .lookup.unqual], в областях поиска выполняется поиск декларации в порядке, указанном в каждой из соответствующих категорий; поиск имени заканчивается, как только найдено объявление для имени .

Подчеркнутая часть «поиск имени заканчивается, как только найдено объявление для имени», означает, что однажды имя найдено, поиск останавливается.

Итак, мой вопрос:

void func(int){}
void func(double){}
int main(){
  func(0);
}

Рассмотрим приведенный выше код. Имя fun используется безоговорочно. Таким образом, безоговорочные правила поиска выполняются. Следовательно, как только func(double) или func(int) найден, поиск останавливается. Итак, почему func может быть перегружен, то есть набор функций-кандидатов содержит и func(int), и func(double)? Разве это не противоречит безусловным правилам поиска? Если я что-то упустил, поправьте меня.

1 Ответ

3 голосов
/ 23 апреля 2020

Разумный вопрос. Соответствующей частью является "поиск областей для объявления в указанном порядке ".

В псевдокоде

for (auto scope: scopes)
{
   if (scope.contains(name))
      return scope;
}
throw ill_formed(name);

Как только будет найдена одна область, содержащая name, эта область будет выбрана. Дальнейшие области в списке не ищутся. Даже если name происходит в этой области, оно не будет участвовать в разрешении перегрузки.

Однако в вашем примере выбранная область содержит не одно, а два объявления func, поэтому разрешение перегрузки по-прежнему происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...