Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Разное поведение компиляторов для вызова функций

#cpp #visual_cpp #gcc #шаблоны_с++


Почему в таком контексте сначала вызывается вторая функция, а потом первая для gcc,
а для vc++ оба раза - вторая?

Вот код:

#include 

template
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”, они, кажется, исправились, но я это не проверял.

Комментариев нет:

Отправить комментарий