给出以下代码片段:
#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"; }
如果使用gcc编译,则标记的行挂起,汇编步骤至指示无限循环。我在不同的操作系统上尝试了GCC 5.4、6.3、8.2、9.2,结果是一样的。 在wandbox上,也尝试了clang(可能是libc++而不是libstdc++附带的),它可以很好地终止。
只有当ignore的第二个参数是设置了MSB的字符,并且流中前后至少有一个字符时,才会发生这种情况。这是libstdc++中的错误,还是标准禁止使用非ascii分隔符?