Раздел 26.5.1.1 пункт Генератор UIntType противоречие 1 из стандарта C++ 11 (N3242) говорит:C++ 11 случайное число
В данном подпункте 26.5, эффект инстанцировании шаблона:
[...]
е), который имеет параметр типа шаблона с именем
UIntType
является не определен, если соответствующий шаблон аргумент является резюме, неквалифицированные и является одним изunsigned short
,unsigned int
,unsigned long
, илиunsigned long long
.
И он определяет линейный конгруэнтный генератор в 26.5.3.1. Определение класса начинается так:
template<class UIntType, UIntType a, UIntType c, UIntType m>
class linear_congruential_engine
minstd_rand0
, кажется, нарушают это ограничение:
typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
minstd_rand0;
Как он использует uint_fast32_t (который не гарантированно будет один из unsigned short
, unsigned int
, unsigned long
, или unsigned long long
) в minstd_rand0
для параметра шаблона с именем UIntType
, он имеет неопределенный эффект для #include <random>
или, по крайней мере, для использования minstd_rand0
. Эта проблема также относится к другим предопределенным RNG, и, похоже, она не исправлена в C++ 14.
Мои вопросы:
- Является ли это на самом деле противоречие (или, скорее экстремальное количество неопределенного поведения), или я что-то пропустил?
- Оказалось ли это в отчете о дефектах?
Edit: Я заметил, что this отчет дефект, как представляется, связаны с этой проблемой.
Ну, предложение * Обязательное поведение *, которое следует за ним, возможно, обязательно требует использования такой вещи, чтобы быть четко определенным. Независимо от того, существует ли реальная система, в которой 'uint_fast32_t' является * не * одним из этих типов? –
@ T.C. Полагаю, что это возможно, но я думаю, что для этого требуется только 10000-й вызов. Вызов 10001th все равно может вызвать проблему (или, если на то пошло, двигатель, который не был сконфигурирован по умолчанию). – qbt937
@ T.C. MSVC может определять 'uint_fast32_t', используя свой' unsigned __int32' тип (я не знаю, поскольку я не использую MSVC). Я согласен, что этот вопрос академичен. – qbt937