Подтвердить что ты не робот

Определен ли std:: byte?

С++ 17 вводит тип std::byte. Тип библиотеки, который может (предположительно) использоваться для доступа к необработанной памяти, но стоит отдельно от типов символов и представляет собой простой кусок бит.

Пока все хорошо. Но определение меня слегка волнует. Как указано в [cstddef.syn]:

enum class byte : unsigned char {};

Я видел два ответа на SO, которые, по-видимому, подразумевают разные вещи о надежности вышеупомянутого. Этот ответ утверждает (без ссылки), что перечисление с базовым типом имеет те же требования к размеру и выравниванию, что и указанный тип. Интуитивно это кажется правильным, поскольку указание базового типа допускает непрозрачные объявления перечисления.

Однако этот ответ утверждает, что стандарт гарантирует, что две перечисления с одним и тем же базовым типом совместимы с макетом и не более.

При чтении [dcl.enum] Я не мог не заметить, что действительно, базовый тип используется только для определения диапазона перечисления. Нет упоминаний о требованиях к размеру или выравниванию.

Что мне не хватает?

4b9b3361

Ответ 1

<суб > (Документирование комментариев, сделанных @T.C., которые в конечном итоге отвечают на мой вопрос)
(Я удалю это, если T.C когда-нибудь захочет переформулировать свой собственный ответ.)


Как ни странно, N2213 имел формулировку, гарантирующую идентичность представление к базовому типу, но эта формулировка была удалена в N2347. Фактически, он даже удалил формулировку С++ 03, предусматривающую идентичный размер без какой-либо очевидной замены.


Более общий вопрос относительно перечислений и их основных типов вероятно, стоит основной проблемой, учитывая, что CWG одобрила это формулировки std::byte и предположительно считали, что отношения размера/выравнивания. В практическом плане ясно Цель состоит в том, чтобы std::byte заняться, ну, один байт; нет смысла разработчик сделал бы это по-другому.

Ответ 2

По существу, существует специальная формулировка вокруг стандартного проекта С++ 17, который дает std::byte те же свойства в отношении сглаживания как char и unsigned char.

Чтобы дать вам пример, в $6.10 в n4659 он указывает

8 Если программа пытается получить доступ к сохраненному значению объекта с помощью значения gl, отличного от одного из следующих типов, поведение undefined.
[...]
(8.8) - a char, unsigned char или std:: byte type.

Я не делал исчерпывающий поиск, но, по сути, где-нибудь, где char получает специальное обращение в стандарте, то же самое дается std:: byte. Что касается доступа к памяти, представляется неуместным, что он определен как перечисление или то, что он является базовым типом.

ИЗМЕНИТЬ
Возможно, я неправильно понял ваш вопрос: если вы спрашиваете, если стандарт гарантирует, что sizeof(std::byte) == alignof(std::byte) == 1, то я считаю, что это не так, поскольку, как представляется, нет формулировки о том, как эти свойства зависят от базового типа области перечисления и В этом отношении я не нашел специальной формулировки для std::byte. Как @T.C. упоминает в комментариях, это, вероятно, дефект в языке.