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

Предположим, есть такой код, в котором foo1 и foo2 являются

пользовательскими функциями, а всё остальное — библиотечное. Сейчас код не компилируется из-за того, что пользователь написал sfinae-unfriendly foo1

Способы заставить код компилироваться:
1) пользователь просто убирает вычисление noexcept
2) пользователь пишет foo1 правильно
3) мы со стороны библиотеки переписываем bar так, чтобы исключить вызов foo1 при возможности вызвать foo2

Должен ли я как разработчик библиотеки предпочесть третий вариант решения? Или же написание корректного кода должно быть ответственностью пользователя? Ведь третье решение скрывает проблему, а не решает её

8 ответов

27 просмотров

я правильно понимаю, что foo1 вызывается не потому, что bar_impl(double) выбран, а как часть процесса разрешения перегрузки/инстанциации шаблона?

мне кажется, что запрещать пользователю вычислять noexcept это плохой вариант, потому что не могу придумать случай, когда такой контракт будет разумен третий вариант выглядит как эмуляция SFINAE вне контекста перегрузки. это, наверное, может иметь смысл в каких-то случаях, но не проще ли тогда на нормальную перегрузку перейти?

Ofee-Oficsu Автор вопроса
Vlad
мне кажется, что запрещать пользователю вычислять ...

Дело в том, что проблема пользователя не в вычислении noexcept, а в том, что он написал функцию, которая вне sfinae-контекста делает что-то с заранее неизвестным типом, и это стреляет в ногу таким странным образом. Более правильным решением со стороны пользователя было бы сделать вызов foo1 ill-formed в sfinae-контексте (например, взять второй мой вариант решения или повесить концепт на Fn). Т.е. правильным контрактом было бы требовать от пользователя предоставлять sfinae-friendly реализации функции На нормальную перегрузку перейти не получится, ибо это минимально-воспроизводимый пример, в оригинале одна foo, имеющая две перегрузки с разными тегами и весь набор шаблонной магии, включая очень глубокие рекурсии

А нужен ли trail type в bar_impl? Если использовать просто вывод типа через auto оно собирается.

magras
А нужен ли trail type в bar_impl? Если использоват...

очень зависит от тела bar_impl trail return type с конкретным decltype в этом отношении куда надежнее

Ofee-Oficsu Автор вопроса
magras
А нужен ли trail type в bar_impl? Если использоват...

Тогда мы сами напишем sfinae-unfriendly имплементацию на стороне библиотеки. Для корректной пользовательской реализации мы бы хотели получить ошибку внутри decltype(), а не в теле bar_impl. Потому что в первом случае это ещё не гарантированная ошибка компиляции, а во втором случае — уже гарантированная

Ofee Oficsu
Тогда мы сами напишем sfinae-unfriendly имплемента...

гм. Спасибо, я уже не часто закапываюсь в шаблоны, но кажется теперь осознал.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта