为何右值wstringstream可正常工作而左值不行?
窄字符串转宽字符串的流操作差异原因
这核心是C++标准库中流操作符的重载逻辑导致的:
当操作右值
wstringstream(比如临时对象wstringstream{},或者通过std::move转成右值的对象)时:
编译器会匹配到针对宽字符右值流的operator<<重载,这个重载返回的是wstringstream&(宽字符流的引用)。此时窄字符串字面量会被正确转换为宽字符写入流,而且因为返回的是wstringstream类型的引用,你可以直接调用它的str()成员函数获取宽字符串结果。当操作**左值
wstringstream**时:
此时调用的是继承自basic_ostream<char>的operator<<(const char*)重载——这是专门处理窄字符输出的逻辑,返回值是basic_ostream<char>&(窄字符流的引用)。这个类型不仅没有str()成员函数(编译报错的直接原因),而且根本不会把窄字符串转换为宽字符,完全不符合你的需求。
总结一下:左值流对象用窄字符串触发的是窄字符流的输出分支,返回类型不对也不做编码转换;右值流对象则触发宽字符流的专属分支,既完成转换又返回正确的类型供你调用str()。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

