从空缓冲区构造`std::oflow‘有效吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (17)

考虑以下:

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. init(sb)调用badbitsbNULL 时设置在流上: [C++11: 27.5.5.2/3]: 后置条件:该功能的后置条件见表128。 [C++11: Table 128]: [..] rdstate()goodbit如果sb不是空指针,否则 badbit[..]
  5. 输出操作导致相当于取消引用空指针的操作: [C++11: 27.7.3.1/2]:两组成员函数签名共享公共属性:格式化的输出函数(或插入器)和未格式化的输出函数。这两组输出函数通过与调用等价的操作来生成(或插入)输出字符rdbuf()->sputc(int_type)他们可以使用的其他公共成员basic_ostream除了他们不得以任何虚拟成员rdbuf()除外overflow()xsputn()sync()。 除了它从来没有得到这么多,因为对于basic_ostream::sentry施工而言: [C++11: 27.7.3.4/3]:如果任何准备完成后,os.good()就是trueok_ == true否则ok_ == false。 并且,对于explicit operator basic_ostream::sentry::bool() const;[C++11: 27.7.3.4/5]:效果:返回ok_。 和: [C++11: 27.7.3.7/1]:每个未格式化的输出函数通过构造一个类的对象来开始执行sentry。如果此对象true在转换为类型值时返回,则bool该函数将尽力生成请求的输出。[..] ......这意味着当badbit已经设定好时,根本不会有输出操作发生。

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问5 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问3 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券