Читал тут С++20 на подходе! Встреча в Рапперсвил-Йона и последние пункты про constexpr заинтересовали
Ещё одно занятное изменение, которое рассматривается для приёма в C++20 — это
constexpr!
функции.Такие функции обязаны выполняться только на этапе компиляции, любая попытка использовать их в runtime приведёт к ошибке компиляции. Это одно из изменений необходимых для рефлексии в C++
...
Множество языков программирования в данный момент компилируют/транслируют регулярные выражения ещё перед запуском программы. Таким образом, когда программа стартует, все регулярные выражения уже преобразованы в соптимизированный конечный автомат.
В C++ это не так:
В коде выше конечный автомат из регулярного выражения будет строится при первом заходе в функцию is_valid_mail(). Это долгая операция, которая в добавок будет выполняться в критической секции.bool is_valid_mail(std::string_view mail) { static const std::regex mail_regex(R"((?:(?:[^<>()\[\].,;:\s@\"]+(?:\.[^<>()\[\].,;:\s@\"]+)*)|\".+\")@(?:(?:[^<>()\[\].,;:\s@\"]+\.)+[^<>()\[\].,;:\s@\"]{2,}))"); return std::regex_match( std::cbegin(mail), std::cend(mail), mail_regex ); }
С готовящимися новинками для constexpr вычислений (constexpr new, is_constexpr_evaluated() и др.) можно будет в C++ делать множество вещей на этапе компиляции, в том числе можно будет сделать constexpr std::regex.
С constexpr std::regex конечный автомат для функции is_valid_mail() построится ещё на этапе компиляции.
Непонятно, в этом «множестве других языков программирования» сделана какая-то специальная поддержка регулярных выражений, или же они научились на этапе компиляции разбирать и оптимизировать произвольные DSL из строки (регэкспы это тоже DSL кмк)? С помощью каких механизмов это делается? Я вспоминаю синтаксические макросы и зависимые типы, но в плюсах явно ни то, ни другое, тогда что? Какие будут ограничения у новых constexpr!
по сравнению с другими подходами?
Помню, что в Rust на этапе компиляции разбирается строка формата для printf, выглядит близкой задачей. В общем если кто может нормально осветить тему компайл-тайм вычислений, то пожалуйте в тред