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

ima*_*ett 23 c++ random c++11

正如文件所说:

如果这不是一个的影响是不确定short,int,long,long long,unsigned short,unsigned int,unsigned long,或unsigned long long.

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

Sha*_*our 14

应该允许在此uniform_int_distribution <unsigned char>上有一个库工作组尚未解决的问题,除其他外:

我不知道有什么<random>工作与16位整数,但失败的8位整数,所以我怀疑,IntTypeUIntType可以简单地扩展到允许char系列.或者,这种变化可能仅限于uniform_int_distribution,它绝对是安全的.一个 <random>专家应该决定其变化是最好的.

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

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

和:

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

这会获得unsigned/signed char,尽管不是uint8_tint8_t,但它们可能是等效的.省略了扩展的整体类型,以简化措辞并最大限度地达成共识:

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

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

请注意,此主题也在std讨论列表中显示.

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

这是非常有意的,不支持单字节整数,而不是意外遗漏,所以我们应该小心改变它而不咨询C++ 11的设计者

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

  • 我在上次讨论中的注释表明,不支持单字节整数是非常有意的,而不是意外遗漏,因此我们应该在不咨询C++ 11的设计者的情况下小心改变它. `设施.我的建议是在`random_device`中添加一个成员函数来获取随机字节,而不是触及任何引擎或发行版.这可能比从分发中一次提取一个字节要好得多. (3认同)
  • 仅供参考:LWG 问题 2326 认为 `IntType` 中缺少 `signed/unsigned char` 类型是有缺陷的[关闭为“非缺陷”](http://www.open-std.org/jtc1/ sc22/wg21/docs/lwg-closed.html#2326) 这并不是说它不会被修复。这只是说当前的行为是设计使然,因此更改应该是正式的提议,而不是缺陷修复。 (3认同)
  • @JonathanWakely 你的笔记是否说明了委员会最初故意排除这些字符类型的原因? (2认同)
  • 这些都不能解释为什么我在地球上无法生成可以容纳这些值的最小标准整数类型,例如从 1 到 6 的骰子。这看起来很像是一个疏忽,在冗长的回答和讨论中没有提到任何一个理由。“整数不是字符”是一个糟糕的论点。 (2认同)
  • @VioletGiraffe 嗯,这个措辞给我的感觉是委员会不遗余力地排除一般字符类型,而不仅仅是小整数类型。例如,“wchar_t”和“char32_t”可能存在相同的问题。 (2认同)
  • @VioletGiraffe 这也是我的印象。允许使用“short”,因此它与整数提升没有任何关系。 (2认同)