Разрешение перегрузки находит функции после точки создания шаблона - PullRequest
5 голосов
/ 02 июля 2019

В следующем коде main возвращает 2, в то время как я ожидаю, что он вернет 0 (или, по крайней мере, 7)

extern struct S s;
template<typename T>
constexpr int global(T&) { return 0; }

template<typename T>
//constexpr
int func(T& t) { return global(t); }

int main()
{
    return global(s) + 2*func(s) + 4*([](auto &a){return global(a);})(s);
}

static constexpr int global(S&) { return 1; }

Этот код также включен https://godbolt.org/z/RkkXwf

Если я раскомментирую constexpr на func, результат изменится на ожидаемый 0.

Из того, что я понимаю, разрешение перегрузки должно учитывать только функции до точки создания шаблона.Но каким-то образом он находит тот, который объявлен после этой точки для контекста, который не является ни constexpr, ни общей лямбдой.

Почему эти три поиска находят разные функции?

1 Ответ

3 голосов
/ 02 июля 2019

Как упомянуто в комментарии в nm, шаблоны функций могут быть созданы в конце модуля перевода, см. # 993 и temp.point .В том же абзаце написано: «Если две разные точки инстанцирования придают специализации шаблона разные значения в соответствии с правилом одного определения, программа некорректна, диагностика не требуется».

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