Это правильно.Условие while(iss)
не выполняется только после прочтения после окончания потока .Итак, после того, как вы извлекли "you"
из вашего потока, все равно это будет верно.
while(iss) { // true, because the last extraction was successful
Итак, вы пытаетесь извлечь больше.Это извлечение не выполняется, но не влияет на значение, хранящееся в tokens
, поэтому оно печатается снова.
iss >> tokens; // end of stream, so this fails, but tokens sill contains
// the value from the previous iteration of the loop
cout << tokens << endl; // previous value is printed again
По этой самой причине вам всегда следует использовать второй подход, который вы показываете.При таком подходе цикл не будет введен, если чтение было неудачным.