Учитывая следующий фрагмент:
#include <iostream>
#include <sstream>
int main()
{
std::stringstream str;
str.put('a');
str.put('\x80');
str.put('a');
str.ignore(32, '\x80'); // hangs
std::cout << str.tellg() << "\n";
}
Если скомпилировано с g cc, отмеченная строка зависает, шаг сборки указывает на бесконечное l oop. Я пробовал G CC 5.4, 6.3, 8.2, 9.2, на разных ОС результат одинаковый. На wandbox, также пробовал clang (который, вероятно, идет с libc ++ вместо libstdc ++), он нормально завершается.
Это происходит только в том случае, если вторым аргументом ignore является символ с установленным MSB, и если есть хотя бы один символ до и после в потоке. Является ли это ошибкой в libstdc ++ или стандарт запрещает разделители, не относящиеся к ascii?