#cpp #visual_cpp #gcc #шаблоны_с++
Почему в таком контексте сначала вызывается вторая функция, а потом первая для gcc, а для vc++ оба раза - вторая? Вот код: #includetemplate void foo(T) { std::cout << "First foo\n"; } struct A { }; template void test(T t) { foo(t); foo(A()); } void foo(A) { std::cout << "Second foo\n"; } int main() { test(A{}); } Вот выполнение для gcc - https://rextester.com/SUT20651, а вот для vc++ - https://rextester.com/JWPC50675.
Ответы
Ответ 1
Краткий ответ: "двухфазный поиск имен" в VC++ реализован не был. Поскольку в строке foo(A()); тип аргумента функции не зависит от аргументов шаблона, поиск подходящей foo должен быть произведен до того, как была объявлена void foo(A). С дугой стороны, в строке foo(t); аргумент функции зависит от параметров шаблона, поэтому поиск функции должен быть произведен в точке материализации шаблона (т.е. в строке test(A{});), где void foo(A) уже объявлена. Авторы VC позволили себе отступить от буквы стандарта и поиск имен всегда проводили в точке материализации шаблона. Начиная с версии Visual Studio 2017 “15.3”, они, кажется, исправились, но я это не проверял.
Комментариев нет:
Отправить комментарий