gpt4 book ai didi

c++ - char_traits::int_type 的大小不够大吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:56 27 4
gpt4 key购买 nike

考虑以下程序:

#include <iostream>
#include <sstream>
#include <string>

int main(int, char **) {
std::basic_stringstream<char16_t> stream;

stream.put(u'\u0100');
std::cout << " Bad: " << stream.bad() << std::endl;

stream.put(u'\uFFFE');
std::cout << " Bad: " << stream.bad() << std::endl;

stream.put(u'\uFFFF');
std::cout << " Bad: " << stream.bad() << std::endl;

return 0;
}

输出是:

 Bad: 0                                                                                                                                                                                
Bad: 0
Bad: 1

设置 badbit 的原因似乎是因为如果字符等于 std::char_traits::eof(),'put' 设置 badbit。我现在不能再投入流中了。

http://en.cppreference.com/w/cpp/string/char_traits它指出:

int_type: an integer type that can hold all values of char_type plus EOF

但如果 char_type 与 int_type (uint_least16_t) 相同,那么这怎么可能是真的?

最佳答案

标准很明确,std::char_traits<char16_t>::int_typestd::uint_least16_t 的类型定义,请参阅 [char.traits.specializations.char16_t],其中还说:

The member eof() shall return an implementation-defined constant that cannot appear as a valid UTF-16 code unit.

我不确定它是如何与 http://www.unicode.org/versions/corrigendum9.html 交互的但主要 C++ 实现中的现有做法是对 char_traits<char16_t>::eof() 使用全一位模式,即使 uint_least16_t恰好有 16 位。

经过深思熟虑,我认为实现可以通过制作 std::char_traits<char16_t>::to_int_type(char_type) 来满足角色特征要求。给定 U+FFFF 时返回 U+FFFD。这满足 eof() 的要求返回:

a value e such that X::eq_int_type(e,X::to_int_type(c)) is false for all values c.

这也将确保在检查 basic_streambuf<char16_t>::sputc(u'\uFFFF') 的结果时可以区分成功和失败。 , 所以它只返回 eof()失败,返回 u'\ufffd'否则。

我会试试的。我创建了 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80624在 GCC 中跟踪这个。

我还报告了一个 issue不符合标准,所以我们可以修复“不能作为有效的 UTF-16 代码单元出现”的措辞,也可以通过其他方式修复它。

关于c++ - char_traits<char16_t>::int_type 的大小不够大吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43769773/

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