Что такое предлагаемый тип C23 `_Either`?

Предложения C23 n3003 и n2366 вскользь упоминают предлагаемый тип на первой и седьмой страницах соответственно, и мне пока не удалось найти никаких других упоминаний о нем. Насколько я могу судить, он не упоминается ни в рабочем проекте C23 , ни в каких-либо других предложениях C23 .

Похоже, что они предлагаются как тип суммы, аналогичный перечислениям в Rust. Я полагаю, что это конструкция времени компиляции, которая заставляет программиста проверять как левый, так и правый регистр типов каждый раз, когда она вычисляется. Есть ли упоминания о том, что я пропустил? Есть ли у кого-нибудь мысли о том, что именно_Eitherесть и как это реализовано?

1 ответ

Что такое предлагаемый тип C23?

Для C такой тип не был официально предложен. Судя по всему, это идея, исходящая от участников WG21 (C++), но я не думаю, что что-то подобное было официально предложено и для C++.

Похоже, это соответствующий дискуссионный документ: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0709r4.pdf. Он не дает фактической спецификации_Either, но он использует символы_Either(A, B), для типов и , чтобы представлять тип, который может содержать (или быть ) либоAилиB, и который каким-то образом указывает, какой из них содержит тот или иной экземпляр. Это может быть реализовано, например, как дискриминируемый профсоюз, или в документе предполагается, что это также может быть полностью оставлено на усмотрение реализации, аналогичноva_args.

Это связано с предложениями C23 n3003 и n2366, поскольку они касаются универсальных типов и (совместимого) переопределения типов, которые могут иметь отношение к реализации чего-то вроде_Either().

Другие вопросы по тегам