为什么不允许使用带有char模板参数的uniform_int_distribution?

时间:2016-07-08 15:08:27

标签: c++ templates c++11 standards

C++ Standard在其第26.5.1.1段中陈述如下:

  

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

     

e)具有名为IntType的模板类型参数是未定义的,除非相应的模板参数是cv-unqualified且是shortintlong,{{1}之一},long longunsigned shortunsigned intunsigned long

     

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

0 个答案:

没有答案