How does std::stringstream handle wchar_t* in operator<<?

14,382

Solution 1

Does this have the potential to silently break my code, if I inadvertently mix character types?

In a word: yes, and there is no workaround that I know of. You'll just see a representation of a pointer value instead of a string of characters, so it's not a potential crash or undefined behaviour, just output that isn't what you want.

Solution 2

Yes - you need wstringstream for wchar_t output.

You can mitigate this by not using string literals. If you try to pass const wstring& to stringstream it won't compile, as you noted.

Share:
14,382
Pedro d'Aquino
Author by

Pedro d'Aquino

Updated on July 24, 2022

Comments

  • Pedro d'Aquino
    Pedro d'Aquino over 1 year

    Given that the following snippet doesn't compile:

    std::stringstream ss;
    ss << std::wstring(L"abc");
    

    I didn't think this one would, either:

    std::stringstream ss;
    ss << L"abc";
    

    But it does (on VC++ at least). I'm guessing this is due to the following ostream::operator<< overload:

    ostream& operator<< (const void* val );
    

    Does this have the potential to silently break my code, if I inadvertently mix character types?