标准 (n3797) 规定如下:
27.7.2.2.3 basic_istream::运算符>>
template<class charT, class traits>
basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>& in, charT& c);
template<class traits>
basic_istream<char,traits>& operator>>(basic_istream<char,traits>& in, unsigned char& c);
template<class traits>
basic_istream<char,traits>& operator>>(basic_istream<char,traits>& in, signed char& c);
12 效果:行为类似于 in 的格式化输入成员(如 27.7.2.2.1 中所述)。构造哨兵对象后提取一个字符从 in 中(如果有),并存储在 c 中。否则,该函数调用 in.setstate(failbit)。
27.7.3.6.4 字符插入器函数模板
// specialization
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, char c);
// signed and unsigned
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, signed char c);
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, unsigned char c);
1 效果:表现为 out 的格式化输出函数(27.7.3.6.1)。构造一个字符序列 seq。如果 c 的类型为 char 并且流的字符类型不是 char,则seq 由 out.widen(c) 组成;否则 seq 由 c 组成。确定 seq 的填充,如 27.7.3.6.1 中所述。将 seq 插入到 out 中。调用 os.width(0)。
所以第一个问题的答案是:是的,标准要求operator >>
and operator <<
行为完全相同char
, unsigned char
and signed char
,也就是说它们读/写单个字符,而不是整数。不幸的是,标准没有解释原因。我希望有人能阐明2和3。