C ++ 11标准的第29.6.1.1节将UIntType
参数限制为<random>
引擎模板为unsigned short
或更大。其他类型的行为 - 特别是unsigned char
- 未定义。
虽然GCC(至少4.9.2)接受unsigned char,但由于该类型的静态断言,VS2017编译器出错。
我的问题是:
为什么char类型的行为没有被标准定义?
VS2017是出于技术原因禁止这种情况,还是仅仅是为了防止非标准使用?
答案 0 :(得分:0)
假设您的问题与技术原因有关<random>
引擎至少需要一个简短的无符号模板参数,而不是C ++中未定义行为的一般含义。
UIntType
是参数名统称,用于表示<random>
设施的无符号整数参数,主要是随机引擎(我想为了简化和统一库要求) )。
现在,唯一小于短片的类型是sizeof(T)==1
,因此实际上有limits<T>::max == 255
;所以,我想你的问题的答案是255对于某些(所有?)引擎而言太小,无法合理地满足任何环境下的随机引擎语义。
例如,在这种情况下,IIRC linear_congruential
的最大期限为64,分布严重不均匀;即使对于最愚蠢的应用场景,这样的事情也很难被称为伪随机生成器。
至少可以说,要求实现提供'功能'无符号字符专业化将是虐待狂。当然,由于行为未定义,在这种情况下,没有任何条件禁止实施省略诊断,或者甚至出于任何原因提供此类专业化......