Telegram Group & Telegram Channel
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



tg-me.com/cpp_lib/1944
Create:
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

View MORE
Open in Telegram


telegram Telegram | DID YOU KNOW?

Date: |

Dump Scam in Leaked Telegram Chat

A leaked Telegram discussion by 50 so-called crypto influencers has exposed the extraordinary steps they take in order to profit on the back off unsuspecting defi investors. According to a leaked screenshot of the chat, an elaborate plan to defraud defi investors using the worthless “$Few” tokens had been hatched. $Few tokens would be airdropped to some of the influencers who in turn promoted these to unsuspecting followers on Twitter.

If riding a bucking bronco is your idea of fun, you’re going to love what the stock market has in store. Consider this past week’s ride a preview.The week’s action didn’t look like much, if you didn’t know better. The Dow Jones Industrial Average rose 213.12 points or 0.6%, while the S&P 500 advanced 0.5%, and the Nasdaq Composite ended little changed.

telegram from pl


Telegram Библиотека C/C++ разработчика
FROM USA