N3337文档(除其他外)定义了用于生成随机数的函数,例如std::mt19937
或std::uniform_int_distribution
。
这是在Visual Studio中可编译的代码示例:
#include <random>
#include <iostream>
int main() {
std::mt19937 generator(200);
const std::discrete_distribution<int> distribution({41, 9, 40, 10});
for(int i = 0; i < 16; i++) {
char a = 'A' + distribution(generator);
std::cout << a;
}
std::cout << "\n";
return 0;
}
问题是const
之前的std::discrete_distribution
说明符。 N3337文档指出,可能所有分布函数中的operator()
均未标记const
。这意味着不可能在operator()
对象上调用const
。但是Visual Studio并没有任何问题,因为大多数分发函数中的operator()
方法的标头中确实包含const
说明符(似乎唯一的例外是std::normal_distribution
-他们那里没有const
!)。
std::discrete_distribution
的MSDN文档中没有const
的说明符对我们没有帮助,而实际上标头确实有const
:MSDN >
这里是否有Visual Studio不符合标准的原因?
这是一个问题,因为它使用Visual Studio编写的代码无法在其他编译器(如GCC)中进行编译,GCC已将operator()
正确标记为non-const
,并且不允许上述程序被