Я пытаюсь скомпилировать эту программу (см вживой here):Почему конструктор param_type был бы явным для случайного распределения?
int main() {
std::random_device engine;
std::uniform_int_distribution<size_t> dis;
std::cout << dis(engine, {0, 5}) << std::endl;
}
Но он терпит неудачу с сообщением об ошибке:
error: converting to 'const std::uniform_int_distribution<long unsigned int>::param_type' from initializer list would use explicit constructor 'std::uniform_int_distribution<_IntType>::param_type::param_type(_IntType, _IntType) [with _IntType = long unsigned int]'
std::cout << dis(engine, {0, 5}) << std::endl;
Очевидно, это явный конструктор param_type
, предотвращающих нам от этого. Но почему указать это как явное в первую очередь? Это многословно и глупо, если нужно писать
std::cout << dis(engine, decltype(dis)::param_type(0, 5)) << std::endl;
Любые объяснения по этому вопросу? А также, как я мог бы достичь того, чего хочу, лаконичным и элегантным способом, учитывая, что конструктор param_type
является явным в стандарте? Обратите внимание, что на практике диапазон может быть различным при каждом вызове dis
. Таким образом, поставка диапазона на время строительства dis
не помогает.
По моему мнению, конструктор 'param_type' не имеет смысла иметь аргументы по умолчанию. Как правило, необходимость использования параметра param_type просто означает, что значения по умолчанию не применяются. Конструктор 'construct_from()', который вы создали, является хакерским, и да, мне нравится сложный C++-материал :) Я поставлю его в проект [Happy Hacking C++] (https://github.com/Lingxi-Li/Happy_Hacking_CXX). Но для практического использования я просто буду придерживаться 'decltype (...) :: param_type'. – Lingxi