std :: mt19937 завершается ошибкой, когда std :: uint_fast32_t равен 4 байта в GCC

Вы можете использовать этот метод:

function string:split(delimiter)
  local result = { }
  local from  = 1
  local delim_from, delim_to = string.find( self, delimiter, from  )
  while delim_from do
    table.insert( result, string.sub( self, from , delim_from-1 ) )
    from  = delim_to + 1
    delim_from, delim_to = string.find( self, delimiter, from  )
  end
  table.insert( result, string.sub( self, from  ) )
  return result
end

delimiter = string.split(stringtodelimite,pattern) 
12
задан Fureeish 16 January 2019 в 01:01
поделиться

1 ответ

Код, который вы показали, не является причиной сбоя. Полное определение _Shift:

template<typename _UIntType, size_t __w,
     bool = __w < static_cast<size_t>
          (std::numeric_limits<_UIntType>::digits)>
  struct _Shift
  { static const _UIntType __value = 0; };

template<typename _UIntType, size_t __w>
  struct _Shift<_UIntType, __w, true>
  { static const _UIntType __value = _UIntType(1) << __w; };

При этом используется специализация шаблона для проверки размера _UIntType во время компиляции. Первая версия используется, когда __w больше или равно std::numeric_limits<_UIntType>::digits, что имеет место в данном случае. Таким образом, результирующее значение равно 0, и сдвиг влево не выполняется.

Что касается самого сбоя: по-видимому, std::random_device не работает в Windows GCC и дает детерминированные результаты (как вы сами видели). Это также может быть связано с причиной аварии. Этот вопрос столкнулся с аналогичным сбоем, также с GCC 8.2 на Windows.

В качестве обходного пути вы можете использовать библиотеку Boost.Random , которая реализует тот же API.

0
ответ дан interjay 16 January 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: