gpt4 book ai didi

C++输出流运算符<<()中的字符何时加宽?

转载 作者:IT老高 更新时间:2023-10-28 23:20:51 28 4
gpt4 key购买 nike

在我看来,C++ 标准存在不一致之处,特别是在 C++17 草案 (N4659) 的第 30.7.5.2.4 节中,关于何时在输出流的格式化输出操作中加宽字符( operator<<())。 en.cppreference.com 中似乎反射(reflect)了完全相同的不一致。 .

首先,假设以下声明:

std::ostream out;
std::wostream wout;
char ch;
wchar_t wch;
const char* str;
const wchar_t* wstr;

然后声明

  1. out << ch 执行字符加宽,
  2. out << str执行字符加宽,
  3. wout << ch执行字符加宽,
  4. wout << str执行字符加宽,
  5. wout << wch 执行字符加宽,
  6. wout << wstr执行字符加宽。

第一个也是最明显的不一致是 (6) 不可能为真,因为没有 widen()函数采用 wchar_t参数,只有一个采用 char论据。

第二个(表面上的)不一致在 (1) 和 (2) 之间。 out << "x" 对我来说似乎很奇怪应该扩大'x' , 而 out << 'x'不应该。

我误解了标准文本,还是那里有什么问题?如果后者是真的,你知道预期的行为是什么吗?

编辑:显然,这种不一致(如果我是对的)至少从 C++03(第 27.6.2.5.4 节)开始就存在于标准中。文本通过中间标准略有变化,但我在上面解释过的不一致仍然存在。

最佳答案

标准似乎并不完全正确。大多数问题源于各自操作的批量规范。不是单独处理每个重载,而是将类似的重载放在一起描述,从而导致误导性规范。

但我怀疑,任何实现者都无法理解其意图。本质上,当 char 插入到非 char 流中时,需要对字符进行 widen() 以获得流字符的字符类型。这种扩展旨在将源字符集中的一个字符映射到流的宽字符集中的一个字符。

请注意,IOStreams 规范假定流中字符的原始概念是单个实体。由于创建了规范(针对 C++1998 版本),文本并没有真正更新,但是随着 Unicode 的广泛使用,流中的“字符”实际上是编码的字节。尽管流在这个修改后的环境中大部分都可以正常工作,但并没有真正正确地支持一些有助于处理 Unicode 字符的灵 active 。缺少将一个字符“扩展”为 UTF8 字节序列的东西可能就是其中之一。

如果您认为流部分中的不一致/不正确之处需要解决,请提交缺陷报告。关于提交缺陷报告的说明在 http://isocpp.org .当您确实提出问题时,请考虑提供建议的措辞来纠正问题。由于并不缺乏明确的实际意图,并且可能大多数实现无论如何都会做正确的事情,我希望这个问题得到相当低的优先级,并且如果没有提议的措辞,它不太可能受到太多关注。当然,解决这个问题不会改变预期的行为,例如,将 chars “扩展”为 UTF8 序列:这实际上是对流库的重新设计,这可能是有序的,但不会作为缺陷解决的一部分进行。

关于C++输出流运算符<<()中的字符何时加宽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44377346/

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