std::unreachable
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <utility>
|
||
[[noreturn]] void unreachable(); |
(начиная с C++23) | |
Вызывает неопределённое поведение. Реализация может использовать это для оптимизации невозможных ответвлений кода (обычно в оптимизированных сборках) или для их перехвата, чтобы предотвратить дальнейшее выполнение (обычно в отладочных сборках).
Примечание
| Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_unreachable |
202202L |
(C++23) | std::unreachable
|
Возможная реализация
[[noreturn]] inline void unreachable()
{
// По возможности использует специфичные для компилятора расширения.
// Даже если расширение не используется, неопределённое поведение всё
// равно вызывается пустым телом функции и атрибутом noreturn.
#ifdef __GNUC__ // GCC, Clang, ICC
__builtin_unreachable();
#elifdef _MSC_VER // MSVC
__assume(false);
#endif
}
|
Пример
Запустить этот код
#include <vector>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <utility>
struct Color { std::uint8_t r, g, b, a; };
// Предположим, что поддерживается только ограниченный набор ограничений текстуры.
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); // Приводит к неопределённому поведению
}
Возможный вывод:
Segmentation fault
Смотрите также
[[assume]](C++23)
|
указывает, что выражение всегда будет оцениваться как true в данной точке(спецификатор атрибута) |
(C++20) |
сообщает компилятору, что указатель выровнен (шаблон функции) |
Документация C по unreachable
|
Внешние ссылки
| 1. | документация по GCC: __builtin_unreachable
|
| 2. | документация по Clang: __builtin_unreachable
|
| 3. | документация по MSVC: __assume
|