В gcc 10, если имеется точное совпадение или навешивание ссылки (возможно с последующими квалификаторами), шаблоны не рассматриваются, а вот при тривиальных преобразованиях, уже да. Так ли это? Можно ткнуть в стандарт
http://eel.is/c++draft/over.match#funcs.general-7 из шаблонов функций генерируются специализации, которые рассматриваются как обычные кандидаты, насколько я могу судить при этом руками написанные специализации рассматриваются только если в результате разрешения перегрузки выбран соответствующий шаблон — не раньше
https://www.youtube.com/watch?v=NIDEjY5ywqU
Я тоже хотел на это видео дать ссылку, Данная, Спасибо
Видео полистать, но не увидел ответа к сожалению. Я вот о чем: template <typename T> struct TD; template <typename T> TD<T> foo(T *) {} void foo(int *) {} // 1. точное совпадение, ошибки нет void foo(int * const &) {} // 2. добавление & и cv-qual, ошибки нет void foo(int const *) {} // 3. тривиальное преобразование, ошибка шаблона Считаем, что из строк 1-3 одновременно присутствует лишь одна. Мне интересно, где в стандарте мотивирован учёт шаблонов лишь если нет точного совпадения (строка 3) P.S. прошу прощения, мобильное приложение съело "ответ", не туда отправил, отменить не могу
сделайте демонстрацию на годболте, пожалуйста
Сижу с телефона, godbolt не работает(
wandbox с телефонов лучше работает, говорят
https://wandbox.org/permlink/eKf8ukWakyHnGdns https://wandbox.org/permlink/bKCrnyzuMh6dHooO https://wandbox.org/permlink/Djjml0XT9S0hhQGk
я все тянул с ответом, думая, что придется в [over] копаться, но ответ на ваш вопрос видится более простым: мне видится логичным, что синтезированная foo(int*) выигрывает у foo(const int*), потому что она точнее, и никакие специальные правила для шаблонов функций не нужны
Обсуждают сегодня