Размеченное объединение
Union с явным полем-«меткой», указывающим, какой вариант сейчас хранится.
Union в C/C++ неразмечен: это просто общая память, и ошибки вылезают в рантайме. У размеченного есть информация о типе, которую компилятор может проверить. В TypeScript это discriminated union: type Result = { kind: 'ok'; value: number } | { kind: 'err'; error: string }, а компилятор сужает тип по switch на kind.
Rust-овский enum формально и есть размеченное объединение с неявным дискриминантом; в C++ его роль играют std::variant и std::visit. Типичное применение: типы ответов API, конечные автоматы, узлы AST. Современные системы типов делают такие объединения безопасными, а голый C-union опасен — можно прочитать не то поле и получить неопределённое поведение.