<random>引擎模板的未定义行为

时间:2018-01-05 09:19:44

标签: c++ c++11 random

C ++ 11标准的第29.6.1.1节将UIntType参数限制为<random>引擎模板为unsigned short或更大。其他类型的行为 - 特别是unsigned char - 未定义。

虽然GCC(至少4.9.2)接受unsigned char,但由于该类型的静态断言,VS2017编译器出错。

我的问题是:

  1. 为什么char类型的行为没有被标准定义?

  2. VS2017是出于技术原因禁止这种情况,还是仅仅是为了防止非标准使用?

1 个答案:

答案 0 :(得分:0)

假设您的问题与技术原因有关<random>引擎至少需要一个简短的无符号模板参数,而不是C ++中未定义行为的一般含义。

UIntType是参数名统称,用于表示<random>设施的无符号整数参数,主要是随机引擎(我想为了简化和统一库要求) )。

现在,唯一小于短片的类型是sizeof(T)==1,因此实际上有limits<T>::max == 255;所以,我想你的问题的答案是255对于某些(所有?)引擎而言太小,无法合理地满足任何环境下的随机引擎语义。

例如,在这种情况下,IIRC linear_congruential的最大期限为64,分布严重不均匀;即使对于最愚蠢的应用场景,这样的事情也很难被称为伪随机生成器。

至少可以说,要求实现提供'功能'无符号字符专业化将是虐待狂。当然,由于行为未定义,在这种情况下,没有任何条件禁止实施省略诊断,或者甚至出于任何原因提供此类专业化......