Стандартное несоответствие в Visual C ++ <random> - PullRequest
0 голосов
/ 08 февраля 2019

Документ 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 и не позволяет скомпилировать вышеуказанную программу.

...