首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过引用传递的字符串流的奇怪行为

通过引用传递的字符串流的奇怪行为
EN

Stack Overflow用户
提问于 2012-03-12 04:42:04
回答 2查看 1.6K关注 0票数 0

对于一个项目,我想使用stringstream来进行数据。为了实现这个目标,我必须将一些字符串流作为参数传递给一些函数,但是当我输出字符串流时,我看到了类似于地址的东西。

代码:

代码语言:javascript
复制
#include <iostream>
#include <sstream>

void doStuff(const std::iostream& msg)
{
    std::cerr << msg << std::endl;
}

int main(void)
{
    doStuff(std::stringstream("av"));
}

输出为: 0xbff4eb40

有人能解释一下为什么我在传递rvalue时会得到一个地址吗?

为什么我不能按值传递字符串流?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-12 04:48:23

您可能希望访问stringstream存储其数据的字符串:

代码语言:javascript
复制
void doStuff(const std::stringstream& msg)
{
    std::cerr << msg.str() << std::endl;
}

在您的代码中发生的情况是,iostreams包含一个void* operator,如果流包含任何错误或已到达EOF,则返回0,否则返回另一个值。这对于错误检查很有用。

当您尝试将流写入std::cerr时,编译器意识到可以使用该操作符将流转换为空*,并且可以将空*写入ostream(已经定义了operator<< ),因此可以使用它。

请注意,我更改了方法的签名,以便它接收std::stringstream作为参数,因为std::iostream::str没有定义(此方法仅在字符串流上可用)。

票数 4
EN

Stack Overflow用户

发布于 2012-03-12 04:46:42

您可以获得一个地址,因为它(与其他流一样)具有到void *的转换(这主要用作布尔值,用于查看读/写流是否失败)。

你不能通过值来传递它,因为streams (一般来说,不仅仅是stringstreams)不支持复制和/或赋值。

要打印流的内容,可以执行以下操作:

代码语言:javascript
复制
void dostuff(std::iostream &msg) { 
    std::cerr << msg.rdbuf() << "\n";
}

编辑:这是一个完整的演示程序:

代码语言:javascript
复制
#include <iostream>
#include <sstream>

void show(std::ostream &os) { 
    std::cout << os.rdbuf() << "\n";
}


int main(){ 
    std::stringstream test("whatever");
    show(test);
    return 0;
}

当我执行它时,我得到的输出是预期的“随便”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9658693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档