Документ 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
там!).
Не помогает, что документация MSDN для std::discrete_distribution
не имеет спецификатора const
, в то время как в действительности заголовок имеет const
: MSDN
Есть ли здесь причина для несоответствия Visual Studio стандарту?
Это проблема, поскольку она делает код, написанный в Visual Studio, не компилируемым в других компиляторах, напримерGCC, в котором operator()
правильно помечен как non-const
и не позволяет скомпилировать вышеуказанную программу.