ситуации отличается инт от А?
@oficsu
hi нужно поднять выше
Там интереснее вопрос — почему для A работает, я не вижу тут причины для срабатывания ADL
Это определённо ADL, но почему — я не знаю, нужно читать (см. пояснение ниже)
Забавно. Если посмотреть на ветку старую, то там к другому совсем приходили
Хотя, кажется логичным, наш аргумент — A*, поэтому мы пошли в пространство имён A и поискали все функции, в которые мы можем передать A*. Функция, принимающая void* нам подходит и попадает в список кандидатов. Каст из A* в void* происходит уже после этого Для int всё проще — он не объявлен в глобальном скопе, поэтому hi из глобального скопа не находится для него через ADL
ADL почему вызывается?
Потому что argument dependent lookup, а наш аргумент — это ::A*. Для указателя мы проверяем пространства имён типа, на который он указывает
А работает оно потому что темплейт в конце ТУ инстансится?
Я просто думал, что он как-то по-другому резолвится может
Возможная причина, но только лишь поэтому — на счёт этого я не уверен
Полагаю, вся магия в том, что T внутри deleteT будет являться dependent name, именно поэтому: >> ADL examines function declarations with external linkage that are visible from either the template definition context or the template instantiation context А template instantiation скорее всего и будет в конце TU (в main() нам достаточно сигнатуру инстанцировать, и компилятор не должен делать большего) Т.е. сделать просто template<class T> void deleteT() { hi((A*)0); } мы тоже не можем. И вот так не можем, что на практике подтверждает лишь Clang: // ... int main() { deleteT<A>(); } template void deleteT<A>(); void hi(void*);
Обсуждают сегодня