Этот код не выполняет то, что он должен делать:
#include <iostream>
#include <cstdint>
int main()
{
uint8_t small_integer;
std::cin >> small_integer;
std::cout << small_integer;
}
Причина проста: uint8_t
является typedef для unsigned char
, а потоки рассматривают этот тип как текст:
Внедрение Visual С++ 2015
template<class _Traits> inline
basic_istream<char, _Traits>& operator>>(
basic_istream<char, _Traits>& _Istr, unsigned char& _Ch)
{ // extract an unsigned char
return (_Istr >> (char&)_Ch);
}
И аналогичный код с литой до char
для operator <<
.
Мои вопросы:
- Это поведение (потоковые операторы, обрабатывающие подписанный /unsigned char как тип символа, а не целое число), требуемый стандартом?
Если это тогда:
- В чем обоснование такой противоречивой семантики?
- Если это считается дефектом, были ли предложения по изменению этой семантики?
Вероятно, я должен добавить небольшое объяснение, почему я считаю его нелогичным.
Хотя имя типа содержит слово char, часть signed
или unsigned
указывает конкретную целую семантику, и эти типы обычно используются как целые числа в байтах. Даже стандарт определяет через них int8_t
/uint8_t
.
UPD: Вопрос о поведении перегрузок операторов потоковой передачи для unsigned char
и signed char
.