C ++ 11标准(N3242)第26.5.1.1节第1段说:
在整个第26.5节中,实例化模板的效果:
[...]
f)具有名为
UIntType
的模板类型参数 undefined除非相应的模板 参数是cv-unqualified,是unsigned short
,unsigned int
,unsigned long
或unsigned 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 int
,unsigned long
,unsigned long long
或minstd_rand0
之一对于名为UIntType
的模板参数,它似乎对#include <random>
具有未定义的效果,或者至少使用minstd_rand0
。此问题也适用于其他预定义的RNG,并且似乎没有在C ++ 14中修复。
我的问题是:
修改:我注意到this缺陷报告似乎与此问题有关。
答案 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中的提案似乎也解决了此缺陷。