C ++ 11随机数生成器UIntType的矛盾

时间:2015-07-03 02:55:07

标签: c++ c++11 language-lawyer

C ++ 11标准(N3242)第26.5.1.1节第1段说:

  

在整个第26.5节中,实例化模板的效果:

     

[...]

     

f)具有名为UIntType的模板类型参数   undefined除非相应的模板   参数是cv-unqualified,是unsigned shortunsigned intunsigned longunsigned 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;

因为它使用了unsigned short中的uint_fast32_t(不能保证是unsigned intunsigned longunsigned long longminstd_rand0之一对于名为UIntType的模板参数,它似乎对#include <random>具有未定义的效果,或者至少使用minstd_rand0。此问题也适用于其他预定义的RNG,并且似乎没有在C ++ 14中修复。

我的问题是:

  • 这真的是一个矛盾(或者说是极端的未定义行为),还是我错过了什么?
  • 缺陷报告中是否提到过这个问题?

修改:我注意到this缺陷报告似乎与此问题有关。

3 个答案:

答案 0 :(得分:1)

是和否。根据第18.4.1节,uint_fast32_t必须是无符号整数类型的别名。虽然C ++中唯一的无符号整数类型是unsigned char,short,int,long,long,long(3.9.1)所以你提到的部分唯一可能是矛盾的情况是char不知何故是32位或更宽的uint_fast32_t被定义为unsigned char的别名。

答案 1 :(得分:1)

uint_fast32_t被指定为最快的无符号整数类型,宽度至少为32位。

在C ++类型系统中,字符和整数类型都是整数类型,但字符类型不是整数类型(反之亦然)。

最后,无符号整数类型正好是随机生成器枚举的类型。

我的结论是使用uint_fast32_t符合标准(除非我错过了标准的某些部分,其中特别允许uint_fast32_t为非标准类型,或者整数类型的定义包括非标准类型)。

但是,我认为应该修改规范以避免模棱两可的解释。

答案 2 :(得分:0)

我不是专家,但我的回答是肯定这是一个缺陷,如果你是正确的uint_fast32_t根据标准不必是其中一种类型。

您引用的NAD问题2326中的提案似乎也解决了此缺陷。