C++ Standard在其第26.5.1.1段中陈述如下:
在整个第26.5节中,实例化模板的效果:
e)具有名为IntType的模板类型参数是未定义的,除非相应的模板参数是cv-unqualified且是
short
,int
,long
,{{1}之一},long long
,unsigned short
,unsigned int
或unsigned long
。f)具有名为UIntType的模板类型参数是未定义的,除非相应的模板参数是cv-unqualified且是
unsigned long long
,unsigned short
,unsigned int
或{{1}之一}。
所以
unsigned long
可能会导致UB,以及unsigned char,int8_t和uint8_t也是如此。
GNU编译器允许用unsigned long long
实例化std::uniform_int_distribution<char> r;
,上面的代码运行良好。但是微软rightfully claims:
我们试图通过严格而不是宽容来帮助用户代码远离未定义行为的范围。
Visual Studio不会编译代码,但会出现错误:
uniform_int_distribution
这些限制背后的理由是什么?委员会是否允许在该语言的未来版本中使用单字节类型实例化char
?