Попалась мне несколько дней назад старая статья на тему хитрых трюков в C++: "NON-CONSTANT CONSTANT-EXPRESSIONS IN C++". Да, я знаю, статья не новая, но вот такой я медленный газ... 🙁
В статье показывается некий трюк, который типа должен позволить сделать так:
int main () {
constexpr int a = f ();
constexpr int b = f ();
static_assert (a != b, "fail");
}
Т.е. два вызова одной и той же constexpr-функции в compile-time должны дать разный результат.
Мне потребовалось несколько подходов к этой статье, чтобы понять что там написано и как предложенное решение работает. В итого, вроде бы, понял всю эту магию. Но точно могу сказать, что повторить это самостоятельно не смогу.
Посему захотелось написать о том, как же я не люблю эту сторону C++, когда люди находят хитрую лазейку в правилах языка и вместо того, чтобы сказать "вот здесь есть лазейка, которая может привести к неожиданным результатам, будьте осторожны, а еще лучше давайте придумаем как ее исправить и/или вообще устранить", они начинают писать статьи о том, как эту лазейку можно эксплуатировать.
Хочется привести такую аналогию: возможно вы замечали, что временами при вставке штепселя в электрическую розетку возникает искра (и при извлечении такое случается). Иногда искр меньше, иногда больше. Насколько я знаю, этот эффект физиками давно изучен и он лежит в основе электроискровой резки металлов. Ну да не суть. Суть в том, что вот кто-то обнаружил этот эффект и начал экспериментировать: штепсели с разным диаметром контактов, скорость вставки/извлечения, угол под которым все это выполняется и т.д. А потом написал статью, что типа если вы будете делать вот так, то у вас гарантированно будут искры и искры эти будут наиболее яркими. А потом кто-нибудь еще и попытается извлечь какую-нибудь "пользу" из такого "открытия"?
Нормальные люди прочитав о таком, скорее всего, просто покрутят пальцем у виска.
Тогда как в мире C++ вот такое вот "открытие" привлекает внимание и ведет к продолжению подобных поисков и экспериментов. И это считается нормальным. Более того, такие вещи обсуждаются. Возможно, кто-то даже решается применить что-то подобное в своей работе. А потом это вырастет в какую-то продвинутую технику программирования на C++, по типу случайно открытого в середине 1990-х метапрограммирования не шаблонах...
Мне это не нравится. Все-таки хочется, чтобы С++ развивался в сторону удобного, практичного и предсказуемого инструмента, где для решения задач используются специально спроектированные возможности языка программирования, а не это вот все 🙁
Но самый цимес обнаружился при попытке проверить представленное в статье решение 😅
Оказалось, что само решение (в коротком его варианте), работает только в VC++.
Под GCC работает только то длинное решение, которое типа должно обходить баг в clang-е. А вот короткое решение не работает.
Тогда как в clang-е не работает вообще ни короткое, ни длинное.
Ну и, спрашивается, нахера весь этот огород было городить, если он "работает" только на одном из компиляторов? Так и хочется вспомнить старое, но актуальное: "Не выёбывай умничай" 🤬
Павбывавбы.
2 комментария:
Насколько я помню, впервые это "открыл" программист, который, судя по его фейсбуку, ещё и музыкант и подиумная модель. Это поведение обсуждалось на сессии и все согласились, что его следует запретить. Но никто не знал - как.
@sergegers
Я нашел эту статью по ссылкам здесь: https://mc-deltat.github.io/articles/stateful-metaprogramming-cpp20
А пришел туда через здесь: https://a10nw01f.github.io/post/advanced_compile_time_validation/
Т.е. дело это не умерло, как должно бы было, а нашло свое развитие :(
Отправить комментарий