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

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

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

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

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

8 ответов

32 просмотра

я правильно понимаю, что 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 имплемента...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта