Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Назначение char8_t в С++20  [new]
petrav
Member

Откуда:
Сообщений: 2432
В С++20 добавляется тип char8_t и это не псевдоним к char. Я что-то сообразить не могу, вот что можно было бы сказать таким кодом?

void foo(char *);
void foo(char8_t *);

Что значит такая перегрузка? Если std::u8string содержит utf-8 и, наверное, там заработает length(), то что тогда содержит std::string? UTF-8 everywhere or not?

Ну и со Студией. Если файл в кодировке utf-8 without BOM, то такой код некорректный (в строке будет мусор):

char8_t *str = u8"Привет";

Это что теперь файлы перекодировать?
30 июл 20, 17:53    [22175821]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6530
Одна из особенностей char8_t в том что он не алиасится с другими типами в отличие от char.
Это дает возможность компилятору дополнительно оптимизировать код исключая повторное чтение памяти.

Ну а что касается псевдонимов, то char8_t это отдельный тип, и не char и не unsigned char, хотя по сути это unsigned char.
30 июл 20, 18:23    [22175830]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50773

Подстелили соломку против ведроида с его неожиданным 16-ти разрядным char.

Posted via ActualForum NNTP Server 1.5

30 июл 20, 18:29    [22175834]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6530
petrav
Ну и со Студией. Если файл в кодировке utf-8 without BOM, то такой код некорректный (в строке будет мусор):
char8_t *str = u8"Привет";


Наверно баг. Странно что дало присвоить конст в неконст ))
30 июл 20, 18:32    [22175837]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6530
Dimitry Sibiryakov
Подстелили соломку против ведроида с его неожиданным 16-ти разрядным char.

Вряд ли.
По стандарту char равен 1 байту. На ARMe байт = 8 бит, так что не сходится.

А реальная причина, это то что знаковость char не определена стандартом, и если он оказывается знаковым то с ним неудобно работать в контексте utf8.
Еще одна причина, что теперь есть явное указание в типе что это utf8, и можно перегружать функции, как в первом сообщении.
30 июл 20, 18:40    [22175838]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
petrav
Member

Откуда:
Сообщений: 2432
Anatoly Moskovsky
petrav
Ну и со Студией. Если файл в кодировке utf-8 without BOM, то такой код некорректный (в строке будет мусор):
char8_t *str = u8"Привет";


Наверно баг. Странно что дало присвоить конст в неконст ))

Стауструп писал, что он специально так сделал. Это исключение из правил. Потому что иначе был бы затруднён переход на С++ с Си. Память конечно read only.
30 июл 20, 18:46    [22175840]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
petrav
Member

Откуда:
Сообщений: 2432
Anatoly Moskovsky

Еще одна причина, что теперь есть явное указание в типе что это utf8, и можно перегружать функции, как в первом сообщении.

Вот мой вопрос как раз про это! Зачем такая перегрузка если и в char*, и char8_t* у нас utf-8 ?
30 июл 20, 18:58    [22175849]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Aklin
Member

Откуда: Прямо сейчас меня здесь нет
Сообщений: 59447
Anatoly Moskovsky
По стандарту char равен 1 байту.
По какому?

Я знаю несколько таргетов, где sizeof(char) == 2 или == 4
30 июл 20, 19:11    [22175859]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50773

petrav
В С++20 добавляется тип char8_t и это не псевдоним к char.

А ещё в C++11 добавились char16_t и char32_t. Комитет просто решил докончить картину:
char16_t - type for UTF-16 character representation, required to be large enough
to represent any UTF-16 code unit (16 bits). It has the same size, signedness, and
alignment as std::uint_least16_t, but is a distinct type.
char32_t - type for UTF-32 character representation, required to be large enough to
represent any UTF-32 code unit (32 bits). It has the same size, signedness, and alignment
as std::uint_least32_t, but is a distinct type.

(since C++11)

char8_t - type for UTF-8 character representation, required to be large enough to
represent any UTF-8 code unit (8 bits). It has the same size, signedness, and alignment as
unsigned char (and therefore, the same size and alignment as char and signed char), but is
a distinct type.

Posted via ActualForum NNTP Server 1.5

30 июл 20, 19:13    [22175860]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
vAH_O6Vg
Member

Откуда:
Сообщений: 11
Aklin
Anatoly Moskovsky
По стандарту char равен 1 байту.
По какому?

Я знаю несколько таргетов, где sizeof(char) == 2 или == 4


Для сишечки(брал стандарт 17го года) раздел "The sizeof and _ Alignof operators"
When sizeof is applied to an operand that has type char , unsigned char , or signed char , (or a qualified version thereof) the result is 1.

Для плюсиков(брал стандарт 14го года) раздел "Sizeof"
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1.


Таргеты нагло нарушающие стандарт хотелось бы узнать.
30 июл 20, 20:04    [22175877]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
a guest
Member

Откуда:
Сообщений: 306
petrav
Anatoly Moskovsky
пропущено...


Наверно баг. Странно что дало присвоить конст в неконст ))

Стауструп писал, что он специально так сделал. Это исключение из правил. Потому что иначе был бы затруднён переход на С++ с Си. Память конечно read only.
Нет никакого исключения начиная с C++11.
Aklin
Anatoly Moskovsky
По стандарту char равен 1 байту.
По какому?

Я знаю несколько таргетов, где sizeof(char) == 2 или == 4
А я знаю таргет где sizeof(char) == 3.14
30 июл 20, 20:47    [22175882]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6530
petrav
Стауструп писал, что он специально так сделал. Это исключение из правил. Потому что иначе был бы затруднён переход на С++ с Си. Память конечно read only.

Исключение было для char.
А char8_t это новый тип - ему исключений не надо, потому что нет легаси кода.
31 июл 20, 10:24    [22175971]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
a guest
Member

Откуда:
Сообщений: 306
Anatoly Moskovsky
Исключение было для char.
и wchar_t
1 авг 20, 11:42    [22176500]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Aklin
Member

Откуда: Прямо сейчас меня здесь нет
Сообщений: 59447
vAH_O6Vg
Таргеты нагло нарушающие стандарт хотелось бы узнать.
https://ru.stackoverflow.com/questions/118221/Кто-нибудь-встречал-в-своей-практике-sizeofchar-1
3 авг 20, 15:28    [22177049]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8761
По той ссылке прямо обратное написано, что sizeof(char)=1, а вот "байты" могут быть любого размера (8,16,32 бит в машинном слове).

Если я правильно прочитал.
3 авг 20, 15:37    [22177052]     Ответить | Цитировать Сообщить модератору
 Re: Назначение char8_t в С++20  [new]
vAH_O6Vg
Member

Откуда:
Сообщений: 11
Aklin
https://ru.stackoverflow.com/questions/118221/Кто-нибудь-встречал-в-своей-практике-sizeofchar-1

Как правильный помечен ответ с частой путаницей между байтом(минимальная совокупность битов, обрабатываемая одновременно) и октетом(8 бит). По стандарту C в char содержится CHAR_BIT бит и указано, что CHAR_BIT >= 8. Интересный левый факт: в стандарте POSIX CHAR_BIT == 8. Portable Operating System Interface менее Portable чем сишечка.
3 авг 20, 17:17    [22177120]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить