Подготовка к char8_t в C ++ 17 - PullRequest
0 голосов
/ 25 июня 2019

Я использую Microsoft Visual C ++ 16.1 (сообщество 2019) и пытаюсь написать код, который будет «правильным» в C ++ 2020, который, как ожидается, будет иметь тип char8_t, который будет беззнаковым символом.Я определяю тип, подобный этому:

using char8_t = unsigned char;

Код, такой как следующий:

std:string data;
const char8_t* ptr = data.c_str ();

не компилируется, так как не преобразует указатель char со знаком в указатель char без знака безreinterpret_cast.Есть ли что-то, что я могу сделать, чтобы подготовиться к 2020 году без переосмысления приведений повсюду?

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

P1423 (исправление обратной совместимости char8_t) документирует ряд подходов, которые можно использовать для устранения воздействия обратной совместимости из-за принятия char8_t через P0482 (char8_t: тип дляUTF-8 символов и строк) .

Поскольку char8_t является типом без наложения имен, поведение reinterpret_cast не определено, например, для присвоения указателя char8_t дляуказатель на char как в reinterpret_cast<const char8_t*>(data.c_str()).Однако, поскольку char и unsigned char допускаются для псевдонимов любого типа, разрешается использовать reinterpret_cast в другом направлении, например, reinterpret_cast<const char*>(u8"text").

Ни один из подходов к исправлению, описанных в P1423серебряные пули.Вам нужно будет оценить, что лучше всего подходит для ваших случаев использования.Вы также можете оценить ответы в C ++ 20 с u8, char8_t и std :: string .

Что касается char8_t, не являющегося символом UTF-8 и u8stringне является строкой UTF-8, это правильно в том смысле, что char8_t является типом кодовой единицы (не типом кодовой точки), и что u8string не обеспечивает правильные последовательности UTF-8.Однако очень важно, чтобы эти типы использовались только для данных UTF-8.

0 голосов
/ 27 июня 2019

Спасибо за комментарии. Комментарии и дальнейшие исследования исправили серьезное заблуждение, которое вызвало первоначальный вопрос. Теперь я понимаю, что 2020 char8_t это , а не символ UTF-8, а 2020 u8string это не строка UTF-8. Хотя они могут использоваться в реализации «строки UTF-8», они не такие.

Таким образом, использование reinterpret_cast кажется неизбежным, но его можно скрыть / изолировать от набора перегрузок встроенных функций (или набора шаблонов функций). Необходима реализация объекта utf8string (возможно, в качестве шаблона) в качестве отдельного объекта (если таковой еще не существует нигде).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...