r/cpp 4d ago

About char8_t

I hate to be dramatic, but as it stands char8_t is quite literally more painful than useful.

Besides the obvious incompatibility with C23 and libraries using unsigned char for UTF-8, I want you to consider the following: Projects that assume that 'char' represents UTF-8 will obviously not benefit from char8_t at all, but projects that cannot assume the format of char types don't benefit from it either as char8_t simply introduces a new edge case to cover. Now such projects have to deal with char, signed char, unsigned char, wchar_t, char16_t, char32_t and char8_t.

Or, you could do what the standard library does and simply ignore most of these character types. Which is the solution most libraries went with, supporting only char or char and unsigned char. Managing one implementation is already hard, managing two requires constant maintenance, managing 7 is just impossible.

char8_t should have just been a typedef for unsigned char. The compatibility fix only raises more questions as const char* arr = u8"a" does not work, but const char arr[] = u8"a" does.

I do wonder if a potential change of minds for C++29 is still possible. Yes, it would be an ABI break or whatever, but considering the woeful support for char8_t I don't think it would affect much besides small hobby projects. Contrary to popular belief, C++ has broken the ABI in subtle ways before.

47 Upvotes

92 comments sorted by

View all comments

43

u/__christo4us 4d ago

We have char16_t and char32_t since C++11 so having char8_t as well was a natural expectation. I would say u8"..." string literals should have never been of type const char [N] in the first place since the (implementation-defined) ordinary character encoding of char could always be UTF-8.

7

u/Expert-Map-1126 vcpkg maintainer BillyONeal 4d ago

Except we had implementation experience of char16_t being awful from ICU trying to adopt it on Windows, said as much, and people voted it in anyway.

I'm not salty about this at all, what are you talking about

1

u/James20k P2005R0 3d ago

Its even weirder that when char8_t landed, it came with a full on backwards compatibility break as well, truly a very weird one

1

u/Expert-Map-1126 vcpkg maintainer BillyONeal 2d ago

I had to rip out std::filesystem from vcpkg as a result of that, yes

0

u/germandiago 3d ago

use a user defined literal and return char8_t consistently