Пространства имён
Варианты
Действия

std::unreachable

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Утилиты поддержки программ
Прерывание программы
(C++11)
(C++11)
Недостижимый поток управления
Взаимодействие с окружением
Сигналы
Типы сигналов
Нелокальные переходы
Типы
 
<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 в данной точке
(спецификатор атрибута)[править]
сообщает компилятору, что указатель выровнен
(шаблон функции) [править]

Внешние ссылки

1.  документация по GCC: __builtin_unreachable
2.  документация по Clang: __builtin_unreachable
3.  документация по MSVC: __assume
Morty Proxy This is a proxified and sanitized view of the page, visit original site.