问题如何正确使用std::cin.get()
and的返回值std::cin.peek()
?让我想知道是否可以保证
std::char_traits<char>::to_int_type(c) == static_cast<int>(c)
对于所有char
有效值c
。
这出现在很多地方。例如,istream::peek
调用streambuf::sgetc
,用于to_int_type
将char
值转换为int_type
. 现在,std::cin.peek() == '\n'
真的意味着下一个字符是\n
?
以下是我的分析。让我们从[char.traits.require]和[char.traits.specializations.char]收集碎片:
对于每个
int
值e
,to_char_type(e)
返回c
, 如果eq_int_type(e, to_int_type(c))
对于一些c
;其他一些未指定的值。
对于每对
int
值e
和f
,eq_int_type(e, f)
返回eq(c, d)
, 如果e == to_int_type(c)
和f == to_int_type(d)
对于一些c
和d
;true
, 如果e == eof()
和f == eof()
;false
, 如果e == eof()
异f == eof()
或;否则未指定。
eof()
返回一个值e
,使得!eq_int_type(e, to_int_type(c))
所有c
.eq(c, d)
当且(unsigned char) c == (unsigned char) d
当
现在,考虑这个假设的实现:(语法简化)
// char: [-128, 127]
// unsigned char: [0, 255]
// int: [-2^31, 2^31-1]
#define EOF INT_MIN
char to_char_type(int e) {
return char(e - 1);
}
int to_int_type(char c) {
return int(c) + 1;
}
bool eq(char c, char d) {
return c == d;
}
bool eq_int_type(int c, int d) {
return c == d;
}
int eof() {
return EOF;
}
注意
(属性1)从
unsigned char
到的转换int
是保值的;(属性 2)从
char
to的转换unsigned char
是双射的。
现在让我们验证要求:
对于每一个
int
值e
,如果eq_int_type(e, to_int_type(c))
对于一些c
,那么e == int(c) + 1
。因此,to_char_type(e) == char(int(c)) == c
。对于每对
int
值e
andf
,如果e == to_int_type(c)
和f == to_int_type(d)
对于一些c
andd
,则当且eq_int_type(e, f)
当当int(c) + 1 == int(d) + 1
当c == d
(通过属性 1)。EOF 案例也很容易验证。对于每个
char
值c
,int(c) >= -128
, 所以int(c) + 1 != EOF
。因此,!eq_int_type(eof(), to_int_type(c))
。对于每对
char
值c
和d
,eq(c, d)
当且仅当(unsigned char) c == (unsigned char d)
(通过属性 2)。
这是否意味着这个实现符合要求,因此std::cin.peek() == '\n'
没有做它应该做的事情?我在分析中遗漏了什么吗?