std::wbuffe...ffer_convert(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

🌸 NAME 🌸

okay so bestie, this is the manual page for std::wbuffer_convert::wbuffer_convert from the C++ Standard Library β€” yes, the constructor page, and the header is out here truncating like std::wbuffe...ffer_convert(3) (iykyk 😭).


✨ Synopsis ✨

the signatures are giving constructor realness, and (since C++14) is part of the vibe:

wbuffer_convert() : wbuffer_convert(nullptr) {}              (1)
explicit wbuffer_convert( std::streambuf* bytebuf,

                          Codecvt* pcvt = new Codecvt,       (2)

                          state_type state = state_type() );
wbuffer_convert( const std::wbuffer_convert& ) = delete;     (3)

(since C++14)

  1. Default constructor. literally the default one, and the signature shows it forwarding to wbuffer_convert(nullptr).
  2. Constructs the wbuffer_convert object with the specified underlying byte stream, specified codecvt facet, and specified initial conversion state β€” all parameters are optional, bestie.
  3. The copy constructor is deleted, so wbuffer_convert is not CopyConstructible. no cap, it said what it said πŸ’….

πŸ’… Parameters πŸ’…

  • bytebuf β€” pointer to std::streambuf to serve as the underlying narrow character stream.
  • pcvt β€” pointer to a standalone (not managed by a locale) std::codecvt facet. The behavior is undefined if this pointer is null, so please do not play with that.
  • state β€” the initial value of the character conversion state.
fr fr, pcvt being null is not a cute look β€” undefined behavior is not invited to the group chat.

🩹 Defect reports 🩹

The following behavior-changing defect reports were applied retroactively to previously published C++ standards. history really said β€œlet me fix that for you”:

  • P0935R0 β€” applied to C++11; behavior as published: default constructor was explicit; correct behavior: made implicit. slay, glow-up applied retroactively ✨

πŸ“ Example πŸ“

// Run this code

#include <codecvt>
#include <iostream>
#include <locale>
#include <sstream>

int main()
{
    // Wrap a UTF-8 string stream in a UCS4 wbuffer_convert
    std::stringbuf utf8buf("z\u00df\u6c34\U0001f34c");
                       // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c"
                       // or u8"zß水🍌"
    std::wbuffer_convert<std::codecvt_utf8<wchar_t>> conv_in(&utf8buf);
    std::wistream ucsbuf(&conv_in);
    std::cout << "Reading from a UTF-8 stringbuf via wbuffer_convert: "
              << std::hex << std::showbase;
    for (wchar_t c; ucsbuf.get(c);)
        std::cout << static_cast<std::wint_t>(c) << ' ';

    // Wrap a UTF-8 aware std::cout in a UCS4 wbuffer_convert to output UCS4
    std::wbuffer_convert<std::codecvt_utf8<wchar_t>> conv_out(std::cout.rdbuf());
    std::wostream out(&conv_out);
    std::cout << "\nSending UCS4 data to std::cout via wbuffer_convert: ";
    out << L"z\u00df\u6c34\U0001f34c\n";
}

🍌 Output 🍌

Reading from a UTF-8 stringbuf via wbuffer_convert: 0x7a 0xdf 0x6c34 0x1f34c
Sending UCS4 data to std::cout via wbuffer_convert: zß水🍌

and that’s the whole page, bestie 🫢 this little manual moment came from cppreference.com, dated 2024.06.10 β€” bye icon, go wrap those buffers πŸ’–βœ¨

πŸ“¦ where this page comes from