Почему не `std:: uniform_int_distribution <uint8_t>` и `std:: uniform_int_distribution <int8_t>` Разрешено?

Как говорится в документации :

Эффект undefined, если это не один из short, int, long, long long, unsigned short, unsigned int, unsigned long или unsigned long long.

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

Ответы

Ответ 1

Существует нерешенная проблема рабочей группы библиотеки на этом uniform_int_distribution < unsigned char > должно быть разрешено, и в нем говорится, среди прочего:

Я ничего не знаю о <random>, который работает с 16-разрядным целых чисел, но с 8-битными целыми числами не получается, поэтому я подозреваю, что IntTypeи UIntType можно просто расширить, чтобы разрешить семейство char. В качестве альтернативы это изменение может быть ограничено uniform_int_distribution, где он определенно безопасен. <random> эксперт должен решить, какое изменение лучше всего.

Предлагаемая резолюция состоит в том, чтобы изменить ограничение, чтобы разрешить стандартные целочисленные типы:

который имеет параметр типа шаблона с именем IntType - undefined, если только соответствующий аргумент шаблона cv-unqualified и является a стандартный целочисленный тип (3.9.1 [basic.fundamental]

и

который имеет параметр типа шаблона с именем UIntType - undefinedесли соответствующий аргумент шаблона не является qv-неквалифицированным и является стандартный беззнаковый целочисленный тип (3.9.1 [basic.fundamental])

Это приведет к вам без знака/подписи char, хотя не uint8_t или int8_t, но они, скорее всего, эквивалентны. Расширенные интегральные типы были исключены, чтобы упростить формулировку и максимизировать консенсус:

Это также исключает расширенные интегральные типы и широкие типы char, которые в лучшем случае кажутся приятными для использования. Я не возражаю против поддержки любого из этих типов; Я просто выбрал это, чтобы упростить формулировку и, надеюсь, максимизировать консенсус.

Примечание. Это исключает char, так как это реализация определена, подписан ли char или нет.

Примечание. Этот раздел также был приведен в std-обсуждение.

Джонатан Вакели отмечает, что это предложение противоречиво и комментирует, что его заметки из последнего обсуждения включают следующее:

что было совершенно очевидно, что одиночные байтовые целые числа не поддерживаются, а не случайное упущение, и поэтому мы должны быть осторожны в том, чтобы просто изменить это, не обращаясь к дизайнерам С++ 11

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