Вы используете операцию ||
, которая означает, что для условия в while()
должны быть оценены оба выражения.
Поэтому, даже если begin != end
равно false
, оно все равно будет вычислять следующее выражение, которое *begin != val
. Когда начало равно автономному итератору, это означает, что вы пытаетесь разыменовать внешний итератор, который небезопасен и потенциально может привести к неопределенному поведению.