Раздел 26.5.1.1, пункт 1 стандарта С++ 11 (N3242) гласит:
В этом подпункте 26.5 эффект создания шаблона:
[...]
f), который имеет параметр типа шаблона с именем
UIntType
, является undefined, если соответствующий шаблон аргумент cv-unqualified и является одним из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
, он выглядит как имеют эффект undefined для #include <random>
или, по крайней мере, для использования minstd_rand0
. Эта проблема также применима и к другим предопределенным RNG, и она не исправлена в С++ 14.
Мои вопросы:
- Это действительно противоречие (или, скорее, экстремальное количество поведения undefined), или я что-то пропустил?
- Об этом упоминалось в отчете о дефектах?
Изменить: Я заметил, что этот отчет о дефекте, похоже, связан с этой проблемой.