std:: unreachable
From cppreference.net
C++
Utilities library
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Program support utilities
| Program termination | |||||||||||||||||||||
|
|||||||||||||||||||||
| Unreachable control flow | |||||||||||||||||||||
|
unreachable
(C++23)
|
|||||||||||||||||||||
| Communicating with the environment | |||||||||||||||||||||
| Signals | |||||||||||||||||||||
| Signal types | |||||||||||||||||||||
| Non-local jumps | |||||||||||||||||||||
| Types | |||||||||||||||||||||
|
Определено в заголовке
<utility>
|
||
|
[
[
noreturn
]
]
void
unreachable
(
)
;
|
(начиная с C++23) | |
Вызывает undefined behavior в заданной точке.
Реализация может использовать это для оптимизации невозможных ветвей кода (обычно в оптимизированных сборках) или для их перехвата с целью предотвращения дальнейшего выполнения (обычно в отладочных сборках).
Содержание |
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_unreachable
|
202202L
|
(C++23) |
std::unreachable
|
Возможная реализация
[[noreturn]] inline void unreachable() { // Используются специфичные для компилятора расширения, если возможно. // Даже если расширение не используется, неопределенное поведение все равно вызывается // пустым телом функции и атрибутом noreturn. #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; }; // Предполагается, что поддерживается только ограниченный набор возможностей текстур. 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
(
expression
)]]
(C++23)
|
указывает, что
expression
всегда будет вычисляться в
true
в заданной точке
(спецификатор атрибута) |
|
(C++20)
|
информирует компилятор, что указатель выровнен
(шаблон функции) |
|
Документация C
для
unreachable
|
|
Внешние ссылки
| 1. |
Документация GCC:
__builtin_unreachable
|
| 2. |
Документация Clang:
__builtin_unreachable
|
| 3. |
Документация MSVC:
__assume
|