следующем коде?
static std::mt19937 &getGlobalRandomEngine()
{
// создаётся член класса - f
std::mt19937 mt = f.RandomEngine(); // из этого класс берётся переменная, которая по-дефолту инициализирована уже, например mt(179)
return mt;
}
В чём суть этого блока:
1) возврат ССЫЛКИ на генератор рандомных чисел, которая будет действительна только в текущем файле
2) Этот блок будет использоваться при условии, если в другом .cpp произошли конкретные изменения и был передал сигнал об этом
3) Но! Так как происходит переинициализации mt в этом блоке, то имеет место вовзращение ссылки на временный объект - ошибка.
Был вариант решения - static std::mt19937 mt = f.RandomEngine(), но это полная бессмыслица, потому что в чем смысл эту переменную хранить как статик, если при каждом вызове этой функции создаётся новый объект?
Норм будет, если создать ещё одну функцию, где произойдёт единократное инициализация СТАТИЧЕСКОЙ ПЕРЕМЕННОЙ, а в блоке выше будет просто обновление переменной-статик?
Ууу, надо переделать, так делать нельзя
Сделай mt стариком
Убираешь ссылку, возвращаешь объект
Строчка с инициализацией вызовется один раз
Объявить mt как static
Тогда надо возвращать по значению. Либо завести пул (набор) таких объектов, класть новые туда, а после завершения программы удалять все
Обсуждают сегодня