C++ string区间构造函数使用istringstream.str()迭代器出现乱码问题
问题1:乱码原因
std::istringstream的str()成员函数是按值返回底层存储的字符串副本,每次调用iss.str()都会生成一个独立的临时std::string对象,临时对象会在当前子表达式求值结束后自动销毁。
你写的构造语句:
std::string reconst(iss.str().cbegin(), iss.str().cbegin() + iss.tellg());
两次调用iss.str()分别生成了两个互不相关的临时字符串,你取的第一个临时字符串的起始迭代器,和第二个临时字符串计算得到的结束迭代器,属于完全不同的两个容器。用不同容器的迭代器构造std::string属于标准明确规定的未定义行为,出现乱码是这类未定义行为的典型表现。
当你把iss.str()的返回值提前存到一个局部std::string或者std::string_view变量时,两次迭代器都取自同一个生命周期足够长的对象,自然不会出现问题。
问题2:是否属于most vexing parse
不属于。
most vexing parse是C++语法解析层面的歧义问题,特指开发者本想定义调用构造函数的对象,却被编译器解析为函数声明的场景。你的代码不存在任何语法解析歧义,问题完全是运行时语义层面的未定义行为,和most vexing parse无关。
内容的提问来源于stack exchange,提问作者Captain Hatteras
相关产品推荐
相关产品推荐

