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

2024-01-07

在我看来,C++ 标准中存在不一致之处,特别是在 C++17 草案 (N4659) 的 §30.7.5.2.4 中,关于何时在输出流上的格式化输出操作中加宽字符 (operator<<())。完全相同的不一致似乎也反映在en.cppreference.com http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2.

首先,假设有以下声明:

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

然后指出

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

第一个也是最明显的不一致是(6)不可能为真,因为没有widen()函数取一个wchar_t论点,只有一个需要char争论。

第二个(看似)不一致是在(1)和(2)之间。我觉得很奇怪out << "x"应该加宽'x', while out << 'x'不应该。

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

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


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

不过,我怀疑任何实施者都难以理解其意图。本质上当一个char被插入到一个非char流字符需要widen()ed 获取流的字符类型的字符。这种加宽旨在将源字符集中的一个字符映射到流的宽字符集中的一个字符。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 何时在输出流运算符 <<() 中加宽字符? 的相关文章

  • 为什么 std::vector 可以处理类定义中的不完整类型?

    出现了以下问题 C 标准似乎说 std vector需要一个完整的类型才能工作 看https en cppreference com w cpp container vector https en cppreference com w cp
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • C++中类成员函数相互调用有什么好处?

    我是 C 新手 我发现下面的编程风格对我来说很有趣 我在这里写了一个简化版本 include
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • C++ 中的析构函数

    我的 AB h 文件中有一个构造函数 class AB private int i public AB i 0 constructor AB i 0 destructor virtual void methodA unsigned int
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • Windows Phone 单元测试现状

    我一直在将我的 Google Fu 推向极限 试图找到最推荐 稳定的设置来为 Windows Phone 应用程序执行 TDD CI 成功做到这一点的人能给我指出正确的方向吗 这是我想要做的 如果可能的话 为不需要电话功能的视图模型和应用程
  • 使用 grpc 和 protobuf Hello world 示例面对 io.netty.util.AttributeKey.valueOf() 方法的 NoSuchMethodError

    运行 GreetingServerTest java 测试后 我收到以下给定的错误 我正在使用 grpc 1 1 0 SNAPSHOT 库并尝试实现 git repo 中给出的 grpc 的基本 Helloword 示例 任何人都可以建议我
  • 是否可以禁用 vim 中的替换模式?

    简而言之 如何才能完全禁用 vim 中的替换模式 我从不使用替换模式 但有时在重新进入插入模式时会意外进入替换模式 当然 在意识到我处于替换模式之前 我会因为输入几个字符而犯错 那么 有没有办法完全禁用替换模式 无论是通过配置设置还是无论如
  • Environment.getExternalStorageDirectory() 弃用替代方案

    在SDK 29 又名Android Q 中 访问外部存储使用的方法Environment getExternalStorageDirectory 已弃用 不再返回可访问的文件 getExternalStoragePublicDirector
  • Prettier 调试输出在 Xcode 中打印 Swift Dictionary

    当我使用print 在 Swift 的字典中 它在控制台中显示得非常漂亮 带有键和值 object Optional customerId 111 transactionId 333 extraId 444 当我跑步时po在同一本字典上 它
  • 如何最有效地利用多核来进行 .NET 中的短计算?

    上下文如下 我正在用 C 为一个小型项目编写一个解释器称为 Heron 的编程语言 http www heron language com 并且它有一些可以并行执行的原始列表操作 我面临的最大挑战之一是 每当遇到可并行操作时 如何将评估器完
  • 如何在运行时发现所有包类型?

    据我所知 参见here https stackoverflow com a 22188310 605022 and here https stackoverflow com a 20805018 605022 中没有类型发现机制反射包 ht
  • 如何使用 jQuery 从 .each 循环创建数组

    如何从 each 循环 内部创建一个数组并在循环外部使用它 My each loop Loop through all but button with class apply profile nav ul li a not apply ea
  • 如何编辑 Laravel 集合中的项目

    我是 Laravel 的新手 我运行一个查询并从数据库中获取行 我想在查看这些行之前编辑这些行的列 这是我的代码片段 callPlans CustomerCallPlan whereNotNull id foreach callPlans
  • 网格单元内采样点的计数

    计算空间网格的每个网格单元内的采样点总数 我想制作一个网格并计算每个网格单元内采样点的总数 我创建了一个随机生成的数据和网格 并尝试使用 sf 和 raster 包计算网格单元内的记录数 使用以前类似的 SO 问题 但没有成功 我还研究了提
  • 我们是否有布尔值的 Button down 属性

    我被分配将delphi代码转换为 Net 并且想知道我们是否像delphi那样具有按钮的down属性 正如此链接中的回答如果 Delphi TSpeedButton 是组中唯一的一个 如何使其保持按下状态 https stackoverfl
  • MVVM 树视图所选项目

    我希望有人愿意在这里帮助我 我对 MVVM 还很陌生 在阅读了很多帖子和示例后我仍然无法弄清楚这一点 我有 EF 数据库 其中包含属于每个项目的项目和计算 我使用树视图和层次数据模板显示项目和计算 当我单击树视图项目时 我想绑定要设置的标签
  • 在ggplot2中旋转图例

    我希望将 ggplot2 图例旋转 90 From qplot mpg wt data mtcars colour cyl 生产 就像是 p lt qplot mpg wt data mtcars colour cyl p scale co
  • Apple Watch 复杂功能未在后台更新

    我有一个 Apple Watch 复杂功能 可以正确初始化并显示我期望的数据 但是 当我的 getNextRequestedUpdateDateWithHandler 方法中返回的 NSDate 触发刷新时 我的委托中唯一被再次调用的方法是
  • Java 连接到 Microsoft Windows Office 套件/之间?

    我在其他地方读过 hazzen 的回应 here https stackoverflow com questions 396355 how to get google page rank and number of searches in
  • Eclipse Android Common XML编辑器无法在模式之间切换

    不知何故 我从 Android Common XML Editor 的标准 WYSIWYG 模式切换到文本模式 我听说屏幕底部应该有一个选项卡可以切换 Layout file xml 但我猜 Eclipse Juno 中没有 我的问题 如何
  • 如果未保存更改,Angular 2/4 会阻止用户离开组件

    我有这个界面 我用它来防止用户离开页面 export interface ComponentCanDeactivate canDeactivate gt boolean Injectable export class PendingChan
  • 文件“obj\Debug\android\bin\packaged_resources”不存在 Xamarin.Android

    我正在使用 C 开发一个 Android 应用程序 它最初构建得非常完美 我关闭了 Visual Studio 2015 并重新打开它 尝试构建 但现在出现以下错误 文件 obj Debug android bin packaged res
  • C++ 中的 Android 用户界面

    我知道这有点重新发明轮子 但是用 C 实现 Android 用户界面有多难 创建按钮之类的东西以及处理按钮点击之类的触摸屏事件是否很难 这是否可行 如果可行 您将如何去做 看一眼必要性 http sourceforge net p nece
  • C++ 何时在输出流运算符 <<() 中加宽字符?

    在我看来 C 标准中存在不一致之处 特别是在 C 17 草案 N4659 的 30 7 5 2 4 中 关于何时在输出流上的格式化输出操作中加宽字符 operator lt lt 完全相同的不一致似乎也反映在en cppreference