std::ostringstream如何转换为bool?

4
我发现了这段代码。
    std::ostringstream str;
    /// (some usage)
    assert( ! str );

当在bool上下文中使用ostringstream时,它代表什么意思?

这可能是一种不正确的用法,但可以编译和运行吗?

3个回答

11

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

顺便提一下,在C++11及更高版本中通过重载explicit operator bool实现此功能(将流测试为bool),而在C++11之前的版本中则通过重载void*转换运算符实现。

以下链接包含一些流失效的示例。这不是特定于字符串流,但它同样适用于它们。

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


4
实际上,这是通过重载void转换运算符实现的。如果使用bool转换运算符,则可以在算术上下文中使用流并且编译器将强制转换为bool值0/1。另一方面,void不能在算术上下文中使用,但可以在bool上下文中使用,因为空指针被评估为false。但在这种情况下,操作符! 被用来显式返回一个bool值。 - Martin York
@Shmoopty:与其他流一样。尝试从字符中读取整数将设置一些错误位。请查看http://www.cplusplus.com/reference/iostream/ios/fail/。 - Martin York
1
@Shmoopty:我不确定ostringstream怎么可能会失败。内存耗尽可能会导致失败,但我愿意打赌,内存满了只会导致异常而不是设置失败。显然,ostringstream像任何std流类一样继承自ios_base,因此它也继承了状态标志,即使在像ofstream或istringstream这样的类中没有那么多调用需求。 - Naaff
@Martin:实际上,人们会重载一个 operator mfptr,其中 mfptr 是成员函数指针类型,这样人们就不会尝试比较对象(这将比较空指针)。 - Alexandre C.
1
@Alexandre C:是的,这是较新的技术。但是STL在此技术被(发现/引入)之前就已经建立了,因此它使用void*技巧。较新的方法指针技巧更好,因为它减少了自动转换的风险。 - Martin York
显示剩余2条评论

4

参考链接:ostringstream::operator void*()ostringstream::operator!()

这两个函数都是C++语言中的ostringstream类的成员函数。第一个函数用于将ostringstream对象转换为void指针类型,以便在条件语句中使用;第二个函数则用于判断ostringstream对象是否为空。

1

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

istringstream is;
is.str( "foo" );
int x;
is >> x;

if ( ! is ) {
   cerr << "Conversion failed";
}

我不确定任何标准流函数如何会导致ostringstream出问题,但您可以自己编写一个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接