std::byte
От: B0FEE664  
Дата: 05.10.18 14:34
Оценка: 9 (2)
А вы знали, что начиная с C++17 правила инициализации class enum были ослаблены и теперь теперь по попущению комитета объект enum'а можно инициализировать значением, которого нет в перечислении, если для enum'а указан underlying type? У меня такое впечатление, что это связано с реализацией std::byte в библиотеке. Соответственно вопрос:

Считаете ли вы реализацию std::byte в стандарте С++ провальной?
Автор: B0FEE664
Дата: 05.10.18
Вопрос: Считаете ли вы реализацию std::byte в стандарте С++ провальной?
И каждый день — без права на ошибку...
Re: std::byte
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.10.18 14:41
Оценка:
Здравствуйте, B0FEE664, Вы писали:

почему бы просто не задать этот вопрос в списке рассылки разрабов? и всем остальным было бы известно мнение авторов на этот счет...

а так да, "по попущению комитета объект enum'а можно инициализировать значением, которого нет в перечислении" — звучит плохо...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: std::byte
От: rg45 СССР  
Дата: 05.10.18 14:52
Оценка: +3
Здравствуйте, B0FEE664, Вы писали:

BFE>А вы знали, что начиная с C++17 правила инициализации class enum были ослаблены и теперь теперь по попущению комитета объект enum'а можно инициализировать значением, которого нет в перечислении, если для enum'а указан underlying type? У меня такое впечатление, что это связано с реализацией std::byte в библиотеке. Соответственно вопрос:

BFE>Считаете ли вы реализацию std::byte в стандарте С++ провальной?
Автор: B0FEE664
Дата: 05.10.18
Вопрос: Считаете ли вы реализацию std::byte в стандарте С++ провальной?


ИМХО, это весьма полезная возможность при реализации битовых флагов и масок, которую раньше приходилось обеспечивать через хаки.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: std::byte
От: night beast СССР  
Дата: 05.10.18 14:54
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>А вы знали, что начиная с C++17 правила инициализации class enum были ослаблены и теперь теперь по попущению комитета объект enum'а можно инициализировать значением, которого нет в перечислении, если для enum'а указан underlying type? У меня такое впечатление, что это связано с реализацией std::byte в библиотеке.


можно подробнее, как это связано с std::byte?
Re[2]: std::byte
От: uzhas Ниоткуда  
Дата: 05.10.18 14:57
Оценка: 4 (2) :)
Здравствуйте, night beast, Вы писали:

NB>можно подробнее, как это связано с std::byte?


std::byte является enum class
мдааа

сколько я не видел этих байтов, они всегда были алиасом к unsigned char
я другого варианта и не предвидел
если мне кто-то даст ссылки почитать, почему так, а не иначе задизайнили, то буду рад почитать
а пока смело в опросе ставлю провал не читал, но осуждаю
Re[3]: std::byte
От: night beast СССР  
Дата: 05.10.18 14:59
Оценка:
Здравствуйте, uzhas, Вы писали:

NB>>можно подробнее, как это связано с std::byte?


U>std::byte является enum class

U>мдааа

хм. неожиданно
Re: std::byte
От: AeroSun  
Дата: 05.10.18 15:08
Оценка: -1
Да норм, в фиксе исправят, а через релиз задепрекейтят.
Всё равно ими никто пользоваться не будет.
Re[2]: std::byte
От: B0FEE664  
Дата: 05.10.18 15:17
Оценка:
Здравствуйте, rg45, Вы писали:

R>ИМХО, это весьма полезная возможность при реализации битовых флагов и масок, которую раньше приходилось обеспечивать через хаки.


ИМХО, перечисление, флаги и маски — это три разные сущности и сделаны они должны быть с помощью трёх разных классов.
И каждый день — без права на ошибку...
Re[3]: std::byte
От: rg45 СССР  
Дата: 05.10.18 15:29
Оценка:
Здравствуйте, B0FEE664, Вы писали:

R>>ИМХО, это весьма полезная возможность при реализации битовых флагов и масок, которую раньше приходилось обеспечивать через хаки.


BFE>ИМХО, перечисление, флаги и маски — это три разные сущности и сделаны они должны быть с помощью трёх разных классов.


Вот прям должны? Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: std::byte
От: Muxa  
Дата: 05.10.18 15:39
Оценка:
R>Вот прям должны? Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?
конечно не должны, но было бы неплохо если бы это было так.
Re[5]: std::byte
От: rg45 СССР  
Дата: 05.10.18 15:44
Оценка:
Здравствуйте, Muxa, Вы писали:

R>>Вот прям должны? Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?

M>конечно не должны, но было бы неплохо если бы это было так.

Хорошо, я понял, что "не должны" здесь вносит некоторую двусмысленность, поэтому переформулирую: это плохо, когда флаги задаются перечислениями? И обязательно ли битовая комбинация флагов должна иметь тип, отличный от типа одиночного флага?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: std::byte
От: B0FEE664  
Дата: 05.10.18 16:13
Оценка: +2
Здравствуйте, rg45, Вы писали:

R>>>ИМХО, это весьма полезная возможность при реализации битовых флагов и масок, которую раньше приходилось обеспечивать через хаки.

BFE>>ИМХО, перечисление, флаги и маски — это три разные сущности и сделаны они должны быть с помощью трёх разных классов.
R>Вот прям должны?
Если мы хотим иметь строго типизированный язык, то — да.

R>Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?


Да. Я могу объяснить почему.

Разница между флагами и перечислениями:
1) у флагов и у перечислений разный набор операций. Для флагов операция | — логична, для перечисления она не имеет смысла.
2) флаги привязаны с битовому представлению, перечисления — нет.
3) этот пункт спорный, но его стоит упомянуть. Для перечисления логично иметь функции Next/Prev, а для флагов как правило они не нужны.

Разница между флагами и масками в том, что разные функции могут принимать в качестве аргументов либо маску, либо флаг, а если нет различия, то легко допустить ошибку. Например, флаг может быть конвертирован в текстовое представление, а маска, как правило — нет. Поэтому будет логично, если маску можно инициализировать флагом, а флаг маской — нет.
Есть и ещё одно различие между флагом и маской: маска может иметь значение 0, а флаг — нет.
И каждый день — без права на ошибку...
Re[6]: std::byte
От: Muxa  
Дата: 05.10.18 16:17
Оценка:
R>Хорошо, я понял, что "не должны" здесь вносит некоторую двусмысленность, поэтому переформулирую:
R>это плохо, когда флаги задаются перечислениями?
Например, при добавлении нового флага в перечисление, нужно не забыть задать ему (правильное) значение, иначе компилятор молча задаст ему неправильное как значение предыдущего+1.
При использовании, к примеру, констант забыть указать значение невозможно.

R>И обязательно ли битовая комбинация флагов должна иметь тип, отличный от типа одиночного флага?

Операции над флагами:
сравнение флагов -> bool (operator ==)
комбинация флагов -> маска (operator |)

Операции над масками:
объединить маски -> маска (operator |)
пересечь маски -> маска (operator &)

Операции над масками и флагами:
установить флаг -> маска (operator |)
сбросить флаг -> маска (operator'ы & и ~)
проверить флаг -> bool (operator &)

Невалидные операции:
флаг1 & флаг2

В скобках указано как оно обычно реализовано.
Как видишь есть пересечения, а значит неизбежны ошибки когда имели в виду одно, а написали другое, и компилятор ничего не сказал.
Re[5]: std::byte
От: rg45 СССР  
Дата: 05.10.18 20:59
Оценка:
Здравствуйте, B0FEE664, Вы писали:

R>>Флаги не должны задаваться перечеслениями, а битовая комбинация двух флагов должна иметь тип, отличный от типа одиночного флага?


BFE>Да. Я могу объяснить почему.


BFE>Разница между флагами и перечислениями:

BFE>1) у флагов и у перечислений разный набор операций. Для флагов операция | — логична, для перечисления она не имеет смысла.
BFE>2) флаги привязаны с битовому представлению, перечисления — нет.
BFE>3) этот пункт спорный, но его стоит упомянуть. Для перечисления логично иметь функции Next/Prev, а для флагов как правило они не нужны.

BFE>Разница между флагами и масками в том, что разные функции могут принимать в качестве аргументов либо маску, либо флаг, а если нет различия, то легко допустить ошибку. Например, флаг может быть конвертирован в текстовое представление, а маска, как правило — нет. Поэтому будет логично, если маску можно инициализировать флагом, а флаг маской — нет.

BFE>Есть и ещё одно различие между флагом и маской: маска может иметь значение 0, а флаг — нет.

Это всего лишь один из подходов, со своими плюсами и минусами. В противовес можно поставить другой подход — тот, который используется в .NET и который, с некоторыми корректировками, может быть перенесен в C++ (и я это делал). В этом подходе все с точностью до наоборот. И никогда я не слышал никаких жалоб, все просто и юзабельно. И, кстати, битовые маски спокойно конвертируются не только в текстовое представление, но и обратоно:

https://docs.microsoft.com/ru-ru/dotnet/api/system.flagsattribute?redirectedfrom=MSDN&view=netframework-4.7.2

https://agladky.ru/blog/flags-enums-in-csharp/
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: std::byte
От: PM  
Дата: 06.10.18 05:44
Оценка:
Здравствуйте, B0FEE664, Вы писали:


BFE>Считаете ли вы реализацию std::byte в стандарте С++ провальной?
Автор: B0FEE664
Дата: 05.10.18
Вопрос: Считаете ли вы реализацию std::byte в стандарте С++ провальной?


Нет, не считаю. Моё мнение — поживем, увидим. Применили смекалочку чтобы задешево получить strong typedef

Время до C++20 еще есть, чтобы набрать практику применения, найти еще несостыковки с другими частями языка, и объявить в этом случаем нерекомендуемым к использованию, если что.
Re: std::byte
От: AleksandrN Россия  
Дата: 06.10.18 21:33
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Считаете ли вы реализацию std::byte в стандарте С++ провальной?


Я не понял, зачем std::byte вообще нужен и чем не устраивает uint8_t и int8_t?
Re[2]: std::byte
От: andyp  
Дата: 07.10.18 10:46
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Я не понял, зачем std::byte вообще нужен и чем не устраивает uint8_t и int8_t?


Байт — минимально адресуемая сущность. В ней не обязательно 8 бит.
Re[5]: std::byte
От: Кодт Россия  
Дата: 07.10.18 14:59
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Если мы хотим иметь строго типизированный язык, то — да.


Всё правильно сказал, кроме того, что эта дорога приведёт нас к окамлу поверх плюсов.

Если волюнтаристски ввести, что комбинация флагов — это ад-хок маска, то легаси код сломается, а тот, который не сломается — не сломается потому, что там уже понатыкан реинтерпрет-каст.
Перекуём баги на фичи!
Re[3]: std::byte
От: AleksandrN Россия  
Дата: 08.10.18 10:47
Оценка:
Здравствуйте, andyp, Вы писали:

A>Здравствуйте, AleksandrN, Вы писали:


AN>>Я не понял, зачем std::byte вообще нужен и чем не устраивает uint8_t и int8_t?


A>Байт — минимально адресуемая сущность. В ней не обязательно 8 бит.


Я это знаю. Но используются ли сейчас аппаратные архитектуры, в которых байт не 8-битный? Даже если используются, не лучше ли для байта сделать целочисленный тип нужно размера, вместо enum class?
Re[4]: std::byte
От: andyp  
Дата: 08.10.18 11:09
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>Но используются ли сейчас аппаратные архитектуры, в которых байт не 8-битный?


Да. Архитектуру с 16ти битными байтами сам использовал.

AN>Даже если используются, не лучше ли для байта сделать целочисленный тип нужно размера, вместо enum class?


Не знаю. Может, не хотели сам язык трогать и обошлись только стандартной библиотекой. Единственное, что на ум приходит — у него выравнивание должно быть как у unsigned char. Лучше бы все таки в язык его вкрутили имхо.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.