gpt4 book ai didi

c++ - 是否保证 std::char_traits::to_int_type(c) == static_cast(c)?

转载 作者:行者123 更新时间:2023-12-03 10:05:51 27 4
gpt4 key购买 nike

问题How to use correctly the return value from std::cin.get() and std::cin.peek() ?让我想知道是否可以保证

std::char_traits<char>::to_int_type(c) == static_cast<int>(c)
对于所有有效 charc .

这出现在很多地方。例如, istream::peek电话 streambuf::sgetc , 使用 to_int_type转换 char值(value)成 int_type .现在, std::cin.peek() == '\n'真正的意思是下一个字符是 \n ?

这是我的分析。让我们从 [char.traits.require] 收集碎片和 [char.traits.specializations.char] :
  • int值(value) e , to_char_type(e)返回
  • c , 如果 ​eq_­int_­type(e, ​to_­int_­type(c))一些 c ;
  • 否则一些未指定的值。

  • 每双 intef , eq_­int_­type(e, f)返回
  • eq(c, d) , 如果 e == to_int_type(c)f == to_int_type(d)一些 cd ;
  • 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 的转换至 unsigned char是双射的。

  • 现在让我们验证需求:
  • int值(value) e , 如果 ​eq_­int_­type(e, ​to_­int_­type(c))一些 c ,然后 e == int(c) + 1 .因此,to_char_type(e) == char(int(c)) == c .
  • 每双 intef , 如果 e == to_int_type(c)f == to_int_type(d)一些 cd ,然后 eq_int_type(e, f)伊夫int(c) + 1 == int(d) + 1伊夫c == d (按属性 1)。 EOF 案例也很容易验证。
  • char值(value) c , int(c) >= -128 ,所以 int(c) + 1 != EOF .因此,!eq_int_type(eof(), to_int_type(c)) .
  • 每双 charcd , eq(c, d)伊夫(unsigned char) c == (unsigned char d) (按属性 2)。

  • 这是否意味着此实现符合要求,因此 std::cin.peek() == '\n'不做它应该做的事?我在分析中遗漏了什么吗?

    最佳答案

    Does that mean this implementation is conforming, and therefore std::cin.peek() == '\n' does not do what it is supposed to do?


    我同意你的分析。这不能保证。
    看来您必须使用 eq_­int_­type(std::cin.peek(), ​to_­int_­type('\n'))以保证正确的结果。

    附言您的 ​to_­char_­type(EOF)由于 INT_MIN - 1 中的签名溢出,具有未定义的行为.当然,在这种情况下未指定该值,但您仍然不能拥有 UB。这将是有效的:
    char to_char_type(int e) {
    return e == EOF
    ? 0 // doesn't matter
    : char(e - 1);
    }
    to_int_type将在 int 和 char 大小相同的系统上使用 UB,以防 c == INT_MAX ,但您已经排除了那些具有假设大小的系统。

    关于c++ - 是否保证 std::char_traits<char>::to_int_type(c) == static_cast<int>(c)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66217741/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com