170 похожих чатов

Https://Godbolt.Org/Z/DKhrzcYjf Раньше уже обсуждали, но можете объяснить чем в этой

ситуации отличается инт от А?

13 ответов

31 просмотр
Слава- Автор вопроса

@oficsu

hi нужно поднять выше

Dumitru Savva
hi нужно поднять выше

Там интереснее вопрос — почему для A работает, я не вижу тут причины для срабатывания ADL

Dumitru Savva
hi нужно поднять выше

Это определённо ADL, но почему — я не знаю, нужно читать (см. пояснение ниже)

Слава- Автор вопроса
Ofee Oficsu
Это определённо ADL, но почему — я не знаю, нужно ...

Забавно. Если посмотреть на ветку старую, то там к другому совсем приходили

Dumitru Savva
hi нужно поднять выше

Хотя, кажется логичным, наш аргумент — A*, поэтому мы пошли в пространство имён A и поискали все функции, в которые мы можем передать A*. Функция, принимающая void* нам подходит и попадает в список кандидатов. Каст из A* в void* происходит уже после этого Для int всё проще — он не объявлен в глобальном скопе, поэтому hi из глобального скопа не находится для него через ADL

Слава
ADL почему вызывается?

Потому что argument dependent lookup, а наш аргумент — это ::A*. Для указателя мы проверяем пространства имён типа, на который он указывает

Слава- Автор вопроса
Ofee Oficsu
Потому что argument dependent lookup, а наш аргуме...

А работает оно потому что темплейт в конце ТУ инстансится?

Слава- Автор вопроса
Ofee Oficsu
Потому что argument dependent lookup, а наш аргуме...

Я просто думал, что он как-то по-другому резолвится может

Слава
А работает оно потому что темплейт в конце ТУ инст...

Возможная причина, но только лишь поэтому — на счёт этого я не уверен

Слава
А работает оно потому что темплейт в конце ТУ инст...

Полагаю, вся магия в том, что 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*);

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта