【问题标题】:Why/how is it valid to pass a non-wide string to wstringstream::operator<<?为什么/如何将非宽字符串传递给 wstringstream::operator<<?
【发布时间】:2026-02-04 15:50:02
【问题描述】:
wstring ss;
ss << L"Some wide-char text" << " and some non-wide-char text";

这似乎工作得很好,但为什么char_type 不是char

【问题讨论】:

  • ss
  • 下次请解释为什么您期望其他行为。对于我们这些已经知道答案的人来说,可能不清楚您的错误期望是什么。例如“我不明白这是如何工作的” 为什么?您是否阅读了一些表明它不会起作用的文档?您是否以一种让您相信它不会的方式来解释标准?您能否提供这项研究的证据,并指出导致您得出结论的材料?你知道,科学的东西。
  • 我不确定这是否不清楚,但我已经稍微调整了这个问题,这是否让我感到困惑的原因更加明显?我想@user657267 回答了我打算问的问题?

标签: c++ visual-c++ stl


【解决方案1】:

无论模板的CharT 是什么,所有流都有char 的重载。

http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2

template< class CharT, class Traits >
basic_ostream<CharT,Traits>& operator<<( basic_ostream<CharT,Traits>& os, 
                                         const char* s );

【讨论】:

    【解决方案2】:

    因为它是。

    插入的正是std::char_traits&lt;char&gt;::length(s) 字符。
    在插入之前,首先使用os.widen()加宽所有字符。

    (source)

    【讨论】: