std::unreachable
Определено в заголовке <utility> | ||
|---|---|---|
[[noreturn]] void unreachable(); | (с C++23) |
Вызывает неопределённое поведение. Реализация может использовать это для оптимизации исключения недостижимых ветвей кода (обычно в оптимизированных сборках) или для отладки, чтобы предотвратить дальнейшее выполнение (обычно в отладочных сборках).
Примечания
| Макроопределения тестов на наличие функций | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_unreachable | 202202L | (C++23) |
std::unreachable |
Возможная реализация
[[noreturn]] inline void unreachable()
{
// Uses compiler specific extensions if possible.
// Even if no extension is used, undefined behavior is still raised by
// an empty function body and the noreturn attribute.
#if defined(_MSC_VER) && !defined(__clang__) // MSVC
__assume(false);
#else // GCC, Clang
__builtin_unreachable();
#endif
} |
Пример
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <utility>
#include <vector>
struct Color { std::uint8_t r, g, b, a; };
// Assume that only restricted set of texture caps is supported.
void generate_texture(std::vector<Color>& tex, std::size_t xy)
{
switch (xy)
{
case 128: [[fallthrough]];
case 256: [[fallthrough]];
case 512: /* ... */
tex.clear();
tex.resize(xy * xy, Color{0, 0, 0, 0});
break;
default:
std::unreachable();
}
}
int main()
{
std::vector<Color> tex;
generate_texture(tex, 128); // OK
assert(tex.size() == 128 * 128);
generate_texture(tex, 32); // Results in undefined behavior
}Возможный вывод:
Segmentation fault
См. также
[[assume(expression)]](C++23) | указывает, что выражение всегда будет истинным в данной точке (спецификатор атрибута) |
|
(C++20) | сообщает компилятору, что указатель выровнен (шаблон функции) |
Документация C для unreachable |
|
Внешние ссылки
| 1. |
Документация GCC: __builtin_unreachable |
| 2. |
Документация Clang: __builtin_unreachable |
| 3. |
Документация MSVC: __assume |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/unreachable