Вы можете использовать этот метод:
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)
Код, который вы показали, не является причиной сбоя. Полное определение _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.