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

qbt*_*937 17 c++ language-lawyer c++11

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

在本子条款26.5中,实例化模板的效果:

[...]

f)一条命名模板类型参数UIntType是未定义的,除非相应的模板参数是CV-不合格和是下列之一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
Run Code Online (Sandbox Code Playgroud)

minstd_rand0 似乎违反了这个限制:

typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647>
    minstd_rand0;
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

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

编辑:我注意到这个缺陷报告似乎与这个问题有关.

Jam*_*orn 0

我不是专家,但我的答案是,是的,这是一个缺陷,如果你是对的,uint_fast32_t根据标准,它不一定是这些类型之一。

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