2014-11-07 4 views
1

В дизайне здесь просто «не один разум», потому что целочисленные данные и символьные данные из 16 бит теперь дифференцируемы, но целочисленные и символьные данные из 8 бит не являются.Почему wchar_t/unsigned short теперь отличается, но нет аналогичного отличия в байтах/без знака?

У C++ всегда был единственный выбор для 8-битовых значений a 'char'. Но функция распознавания wchar_t как официального, отличного типа от unsigned short позволяет улучшить, но только для широкопоточных пользователей. Похоже, что это не скоординировано; язык действует по-разному для 8-битных и 16-битных значений.

Я думаю, что есть четкое значение в наличии более разных типов; с четным 8-битным символом AND и 8-битным «байтом» было бы намного лучше, например. в использовании для перегрузки оператора. Например:

// This kind of sucks... 
BYTE m = 59;  // This is really 'unsigned char' because there is no other option 
cout << m;  // outputs character data ";" because it assumes 8-bits is char data. 
       // This is a consequence of limited ability to overload 

// But for wide strings, the behavior is different and better... 
unsigned short s = 59; 
wcout << s;  // Prints the number "59" like we expect 
wchar_t w = L'C' 
wcout << w;  // Prints out "C" like we expect 

язык был бы более последовательным, если бы существовал новый 8-разрядное целое число типа введено, что позволило бы более интеллектуальных перегрузок и перегрузок, которые ведут себя более аналогичным образом, независимо от того, если вы используете узкие или широкие строки ,

+5

Если бы вы сказали, что 'wchar_t' не должен быть 16 бит? Или даже быть 2 байтами в уверенной среде CHAR_BIT == 8? –

+4

Или что 'wchar_t' /' unsigned short' всегда отличались? –

+0

Я полагаю, что на самом деле неважно, насколько широк wchar_t, точнее, его нельзя путать с целым числом, в отличие от char. Кроме того, char16_t и char32_t тоже есть. – VoidStar

ответ

2

Да, возможно, но с использованием однобайтных целых чисел, которые не являются персонажей довольно редок, и вы можете получить тривиальный вокруг заявленной проблемы путем интегрального продвижения (попробуйте применить унарную + и посмотреть, что происходит).

Стоит также отметить, что ваша посылка ошибочна: wchar_t и unsigned shortесть всегда были различные типы, в соответствии с пунктом 3.9.1/5 в C++ 98, C++ 03, C++ 11 и C++ 14.

+1

Только сегодня я хотел вывести несколько байтов в виде шестнадцатеричных элементов и обнаружил, что смотрю текстовый файл с смайликами и странными буквами. –

+0

@NeilKirk: Да, я получаю это время от времени. Не достаточно часто или с достаточно большим ущербом, чтобы оправдать совершенно новый тип, я не думаю (ом можно представить себе кошмар обратной совместимости с новым байтовым ключевым словом? Byte_t', возможно, но ew и почему это не так же, как 'char' и omg это ужасно) ... да, я просто нашел несколько причин прямо в скобках. И, кроме всего прочего, должна быть очень веская причина добавить что-то к языку, а не наоборот. Хотя я был бы поражен, если бы это еще не было предложено. Дело в том, что здесь нет ответного вопроса. –

+1

Проблема заключается в том, что целочисленный тип является параметром шаблона, и я хочу вывести целые числа в потоки. Полагаю, я мог бы надеть + на них, не думал об этом. –