【问题标题】:How would std::ostringstream convert to bool?std::ostringstream 如何转换为布尔值?
【发布时间】:2009-05-07 16:08:11
【问题描述】:

我偶然发现了这段代码。

    std::ostringstream str;
    /// (some usage)
    assert( ! str );

ostringstreambool 上下文中使用时表示什么?

这可能是编译和运行时发生的错误用法吗?

【问题讨论】:

    标签: c++ casting stream boolean ostringstream


    【解决方案1】:

    它告诉您流当前是否有效。这是所有流都可以做的事情。例如,如果文件未正确打开,文件流可能无效。

    附带说明,此功能(将流测试为布尔值)是通过在 C++11 及更高版本中重载 explicit operator bool以及在版本中重载 void* 转换运算符来实现的在 C++11 之前

    这是一个包含some examples of why a stream might fail 的链接。这并不特定于字符串流,但确实适用于它们。

    编辑:在 Martin York 指出我的错误后将 bool 更改为 void*

    【讨论】:

    • 其实这是通过重载 void* cast 操作符来实现的。如果使用了 bool cast 运算符,那么流可以在算术上下文中使用,编译器将转换为 bool 并使用值 0/1。另一方面,void* 不能在算术上下文中使用,但可以在布尔上下文中用作评估为假的 NULL 指针。但在这种情况下,运营商!用于显式返回一个布尔值。
    • 对于 ostringstream 来说,这意味着什么?可能是内存不足?
    • @Shmoopty:与其他流相同。尝试从字符中读取整数会设置一些错误位。查看cplusplus.com/reference/iostream/ios/fail
    • @Shmoopty:我不确定 ostringstream 是如何失败的。内存不足可能会做到这一点,但我敢打赌,完整的内存只会导致异常而不是设置失败。很明显,ostringstream 就像任何 std 流类一样从 ios_base 继承,因此它也继承了状态标志,即使没有像 ofstream 或 istringstream 这样的类中那么多对它们的调用。
    • @Alexandre C:是的,这是较新的技术。但是 STL 是在这种技术(发现/引入)之前构建的,因此它使用了 void* 技巧。较新的方法指针技巧更好,因为它降低了自动转换的风险。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      表达式有效并评估流的状态。此功能更常用于输入流:

      istringstream is;
      is.str( "foo" );
      int x;
      is >> x;
      
      if ( ! is ) {
         cerr << "Conversion failed";
      }
      

      我不确定任何标准流函数如何导致 ostringstream 变坏,但您当然可以自己编写一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-27
        • 2016-10-07
        • 2016-05-14
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        相关资源
        最近更新 更多