C++11标准(N3242)第26.5.1.1节第1段说:
在整个子句26.5中,实例化一个模板的效果是:
[...]
f) 具有名为
UIntType
的模板类型参数的模板是未定义的,除非相应的模板参数是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;
由于minstd_rand0
使用名为UIntType
的模板参数中的uint_fast32_t
(不能保证是unsigned short
,unsigned int
,unsigned long
或unsigned long long
之一),因此似乎对于#include <random>
,或者至少对于使用minstd_rand0
,具有未定义的效果。这个问题也适用于其他预定义的RNG,并且在C++14中似乎没有得到修复。
我的问题是:
- 这真的是一个矛盾(或者说是极端的未定义行为),还是我漏掉了什么?
- 这是否已经在缺陷报告中提到过?
编辑:我注意到这个缺陷报告似乎与这个问题有关。
uint_fast32_t
不是这些类型之一? - T.C.unsigned __int32
类型来定义uint_fast32_t
(我不知道,因为我不使用MSVC)。尽管如此,我认为这个问题是学术性的。 - qbt937short
、int
等之一。很抱歉我误解了您所说的内置类型。我不应该和您争论。但是,任何标准库实际上都不会遇到这个问题(因为它们将制作一个能够使用uint_fast32_t
的linear_congruential_engine
实现),因此这更多地涉及标准中的矛盾,而不是任何实际问题。 - qbt937