从空缓冲区构造“std::ostream”是否有效?

2024-05-16

考虑以下:

std::ostream out(nullptr);

这是合法且明确定义的吗?


如果我现在这样做怎么样:

out << "hello world\n";

这是合法且明确定义的吗?如果是这样,大概这是一种无操作?


是的,实例化该流是合法且定义明确的。您可以安全地与另一个流交换它,或者稍后给它一个新的指针(这次指向现有的缓冲区)。输出操作本身确实是一个无操作。

原因如下:

  1. 该构造没有非空前提条件,只有以下后置条件:

    [C++11: 27.7.3.2/2]:后置条件:rdbuf() == sb.

  2. 有趣的是,它明确指出不得对sb在构造函数内:

    [C++11: 27.7.3.2/4]:备注:不执行任何操作rdbuf().

  3. 但还要注意:

    [C++11: 27.7.3.2/1]:作用:构造一个类的对象basic_ostream,通过调用为基类分配初始值basic_ios<charT,traits>::init(sb)(27.5.5.2)。

  4. That init(sb)调用有设置的效果badbit在流上时sb一片空白:

    [C++11: 27.5.5.2/3]:后置条件:该函数的后置条件如表 128 所示。

    [C++11: Table 128]: [..] rdstate(): goodbit if sb不是空指针,否则badbit. [..]

  5. 输出操作would导致相当于取消引用空指针的操作:

    [C++11: 27.7.3.1/2]:两组成员函数签名具有共同的属性:格式化输出函数(或插入器)和未格式化输出函数。两组输出函数通过相当于调用的动作生成(或插入)输出字符rdbuf()->sputc(int_type).他们可以使用其他公共成员basic_ostream但他们不得调用任何虚拟成员rdbuf() except overflow(), xsputn(), and sync().

    但它永远不会走到这一步,因为对于basic_ostream::sentry建造:

    [C++11: 27.7.3.4/3]:如果在完成任何准备工作后,os.good() is true, ok_ == true否则,ok_ == false.

    并且,对于explicit operator basic_ostream::sentry::bool() const;:

    [C++11: 27.7.3.4/5]:效果:回报ok_.

    and:

    [C++11: 27.7.3.7/1]:每个未格式化的输出函数通过构造类的对象开始执行sentry。如果这个对象返回true,同时转换为类型值bool,该函数尽力生成所请求的输出。[..]

    …这意味着当badbit已设置。

C++03 中也是如此。 https://stackoverflow.com/a/6240980/560648

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

从空缓冲区构造“std::ostream”是否有效? 的相关文章

随机推荐

  • 将构造函数作为参数传递给方法

    我是java新手 开始研究构造函数 我看到一些构造函数作为参数传递给方法的示例 请告诉我当构造函数作为参数传递给方法时会发生什么 或者建议我一些链接 我可以在其中获得有关使用构造函数的足够知识 根据您需要传递构造函数的目的 您可以考虑传递供
  • 为什么我的混淆矩阵只返回一个数字?

    我正在做二元分类 每当我的预测等于事实时 我发现sklearn metrics confusion matrix返回单个值 难道没有问题吗 from sklearn metrics import confusion matrix print
  • 从 Google 电子表格接收实时更新

    我正在尝试设置与 Google 电子表格的双向同步 我可以使用其数据集将更改推送到 Google 电子表格Google 表格 API V4 https developers google com sheets 现在 我希望每当有人实时或近实
  • DbGeography 多边形到 JSON

    我将 DbGeography 多边形存储在数据库中 我的控制器从数据库获取多边形 我需要将它们转换为 JSON var polygons db Areas Where x gt x Type type Select x gt new Vie
  • JSON 中的哈希到底是什么?

    我正在学习 JSON 但我发现你也可以将所谓的 哈希 放入 JSON 中 我在哪里可以找到什么是哈希 或者你能向我解释一下什么是哈希吗 另外 什么是哈希图 我有 C 和 C 经验 正在学习 JS Jquery 和 JSON 哈希是一个稀疏数
  • 与 SQL 中的 IN 运算符相反

    我怎么能做相反的事情 换句话说 选择所有姓氏不是 Hansen 或 Pettersen 的人 WHERE lastname NOT IN Hansen Pettersen 请参阅 IN 和 NOT IN 运算符 部分SQLite 所理解的
  • linq2sql,存储库模式 - 如何从两个或多个表查询数据?

    我使用存储库模式 和 linq2sql 作为数据访问 并拥有例如 ProductsRep 和 CustomersRep 在非常简单的场景中 数据库有两个表 产品 产品 ID 客户 ID 产品名称 日期 和顾客 客户 ID 名字 姓氏 每个存
  • 实体框架中的批量插入

    我使用批量插入插入大量记录 例如 20K 当我仅插入一个实体时 它会正常工作 但是 当我用来插入多个实体 例如一对多 时 它将仅插入父实体 而不会插入子实体 我的实体和代码 Customer cs public class Customer
  • 使用 pandas.date_range() 生成多个日期时间,每周两个日期

    我在用着pd date range start date end date freq W MON 每周一生成每周频率日期时间start date 2017 01 01 and end date 2017 12 31 这意味着每月大约生成 4
  • Tkinter 菜单删除项

    如何删除任何菜单项 例如我想删除 播放 self menubar Menu self root self root config menu self menubar self filemenu2 Menu self menubar self
  • ValueError:请使用“Layer”实例初始化“TimeDistributed”层

    我正在尝试构建一个可以在音频和视频样本上进行训练的模型 但出现此错误ValueError Please initialize TimeDistributed layer with a Layer instance You passed Te
  • Laravel Passport,通过密码客户端进行多个连接

    我无法理解如何使用 Laravel Passport 通过密码客户端为同一用户实现多个连接 我有一个移动应用程序 需要与基于 Laravel 的 API 进行通信 我的用户在首次启动应用程序时必须输入他们的login and passwor
  • 两个日期范围之间相交的天数

    有人知道如何最好地计算两个日期范围之间相交的天数吗 这是我写的一个小方法来计算这个 private static int inclusiveDays DateTime s1 DateTime e1 DateTime s2 DateTime
  • 将 MouseListener 添加到面板

    我正在尝试将鼠标操作添加到我的面板中 这就是程序应该做的事情 编写一个程序 允许用户通过按三下鼠标来指定一个三角形 第一次按下鼠标后 画一个小点 第二次按下鼠标后 绘制一条连接前两个点的线 第三次按下鼠标后 绘制整个三角形 第四次按下鼠标会
  • 仅删除多对多关系

    我有一个 has and belongs to many friends join table gt friends peoples 要添加朋友 我会这样做 people followers lt lt friend这会创建关系和新的个人资
  • CQRS/ES 世界中的报告

    我想我理解 ES CQRS 背景下的读取模型的想法 如果不明白请纠正我 然而 我对于在 严肃 报道的背景下使用它仍然有一些疑问 假设我使用关系数据库加上一些 ORM 来整理我的读取模型 一个基本的 摘要统计读取模型 可能如下所示 class
  • 外部类与单例类

    假设我们使用 extern 关键字有一些外部链接 我有 在class1 cpp中 MyClass myClassVar NULL 构造函数初始化上述内容 析构函数删除 然后在class2 cpp和class3 cpp中有 extern My
  • 使用 cfdocument 时仅将页脚添加到最后一页

    我正在使用创建多页文档cfdocument 使用动态文本创建 因此可以有任意数量的页面 甚至一页 我可以用
  • 如何为 Nslocal 通知设置自定义重复间隔......?

    我是 iphone 开发新手 我正在尝试在我的项目中使用 NslocalNotification 我需要每 2 小时或每两天或每两个月等给出提醒 目前我正在使用 NslocalNotification 重复间隔 但它仅适用于使用 Ncale
  • 从空缓冲区构造“std::ostream”是否有效?

    考虑以下 std ostream out nullptr 这是合法且明确定义的吗 如果我现在这样做怎么样 out lt lt hello world n 这是合法且明确定义的吗 如果是这样 大概这是一种无操作 是的 实例化该流是合法且定义明