为什么不是`std :: uniform_int_distribution <uint8_t>`和`std :: uniform_int_distribution <int8_t>`允许?

时间:2015-07-16 17:24:40

标签: c++ c++11 random

作为documentation says

  

如果效果不是shortintlonglong longunsigned shortunsigned int,{{ {1}}或unsigned long

如果我不关心范围,我可以掩盖更大类型的位来生成随机数。如果没有,那就更复杂了。为什么默认情况下不提供字节类型?

1 个答案:

答案 0 :(得分:14)

uniform_int_distribution<unsigned char> should be permitted上有一个图书馆工作组尚未解决的问题,其中包括:

  

我不知道<random>中与16位一起使用的任何内容   整数但是以8位整数失败,所以我怀疑IntType   可以简单地扩展UIntType以允许char家族。   或者,这种变化可能仅限于   uniform_int_distribution单独,绝对安全。一个   <random>专家应该决定哪种变化最好。

建议的解决方案是将限制更改为允许标准整数类型:

  

具有名为IntType的模板类型参数是未定义的,除非   相应的模板参数是cv-unqualified,是a   标准整数类型(3.9.1 [basic.fundamental]

  

具有名为UIntType的模板类型参数未定义   除非相应的模板参数是cv-unqualified并且是a   标准无符号整数类型(3.9.1 [basic.fundamental])

这会让你未签名 / 签名的字符虽然不是 uint8_t int8_t ,但它们可能是等效的。省略了扩展的整体类型,以简化措辞并最大限度地达成共识:

  

这也排除了扩展的整数类型和宽字符类型,这些类似于最好的东西。我不反对支持这些类型;我只是选择了这个来简化措辞,并希望最大限度地达成共识。

注意,这排除了char,因为它是实现定义的char是否已签名。

请注意,此主题也在std-discussion list中提出。

Jonathan Wakely指出这个提案存在争议,并评论说他上次讨论的笔记包括以下内容:

  

非常有意识地说不支持单字节整数,而不是偶然的遗漏,所以我们应该在不咨询C ++ 11的设计者的情况下改变它的注意事项

他建议在random_device添加一个成员来提供单个字节,这似乎是一个合理的选择。