tg-me.com/cpp_lib/1944
Last Update:
C++26: constexpr
и исключения
В C++26 мы, наконец, сможем использовать throw
в constexpr
функциях!
Предыстория
В C++11 впервые появилась возможность помечать функции как constexpr
, что позволяло выполнять их на этапе компиляции. Однако с самого начала были ограничения: такие функции не могли содержать try/catch
и throw
. Это было связано с тем, что исключения в constexpr
контексте раньше просто не имели смысла: выполнение либо происходило на этапе компиляции, либо завершалось ошибкой компиляции.
Со временем, с расширением возможностей constexpr
, начали возникать ситуации, когда throw
внутри constexpr
функций стал бы полезен. Особенно это касалось шаблонного кода и библиотек общего назначения, где отказ от throw
усложнял реализацию.
Что изменилось в C++26
C++26 снимает запрет на throw
в constexpr
функциях.
Теперь можно:
* использовать throw
в constexpr
функциях;
* обрабатывать исключения с помощью try/catch
(при выполнении во время выполнения, а не компиляции);
* компилятор по-прежнему выдаёт ошибку, если throw
вызывается при вычислении на этапе компиляции.
Пример
constexpr int might_throw(bool should_throw) {
if (should_throw) {
throw std::runtime_error("Oops");
}
return 42;
}
Теперь это разрешено! Но:
constexpr int x = might_throw(true); // Ошибка компиляции
constexpr int y = might_throw(false); // Ок, y == 42
А вот во время выполнения:
int main() {
try {
std::cout << might_throw(true); // Бросает исключение
} catch (const std::exception& e) {
std::cout << e.what(); // "Oops"
}
}
Зачем это нужно?
Это изменение делает
constexpr
функции более универсальными и приближает их к обычным функциям. Оно открывает путь к более выразительному коду, где одни и те же функции могут использоваться и на этапе компиляции, и во время выполнения без необходимости создавать дублирующие версии.Кроме того, это упрощает написание универсальных библиотек и работу с шаблонным кодом, где невозможно заранее предсказать, будет ли функция использоваться во время компиляции или выполнения.
https://www.sandordargo.com/blog/2025/05/07/cpp26-constexpr-exceptions
#cpp #programming
👉 @cpp_lib
BY Библиотека C/C++ разработчика
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/cpp_lib/1944