このコードは、それが行うことになっているもの行いません。なぜstd::(i)ostreamはsigned/unsigned charをテキストではなく整数として扱うのですか?
#include <iostream>
#include <cstdint>
int main()
{
uint8_t small_integer;
std::cin >> small_integer;
std::cout << small_integer;
}
理由は単純です:uint8_t
はunsigned char
のtypedefで、ストリームがテキストとして、このタイプの治療:
のVisual C++ 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);
}
の場合はoperator <<
にキャストされた同様のコードです。
私の質問:
- は標準で必要とされる(ストリーミング演算子は、文字型ではなく整数として署名/ unsigned char型の治療)この振る舞いですか? そうである場合:
- 逆説的なセマンティクスの背後にある根拠はなんですか?
- これは欠陥と見なされるべきですが、このセマンティクスを変更する提案はありましたか?
私はおそらく、私はそれが直感に反する考える理由を少し説明を追加する必要があります。 型名にcharという文字が含まれていますが、signed
またはunsigned
部分は特定の整数意味を指定します。これらの型は通常、バイトサイズの整数として使用されます。標準でさえ、int8_t
/uint8_t
と定義されています。
UPD:質問は、unsigned char
とsigned char
のストリーミングオペレータオーバーロードの動作についてです。
迷惑です。私は文字をcharとして扱いながら整数としてint8_tを扱う独自のto_string関数を使用しました。 uint8_t、int8_t、charについては、3つの異なる型にならないように完全に有効であると仮定しているので、別の特殊化を追加しました。 – Matt
あなたの質問には答えられませんが、['std :: byte'](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0257r0.pdf)はこの問題を克服する。 – Praetorian
@Praetorian、これは確かに興味深い提案ですが、それはまったく別の問題に取り組んでいます。 –