对于一个项目,我想使用stringstream来进行数据。为了实现这个目标,我必须将一些字符串流作为参数传递给一些函数,但是当我输出字符串流时,我看到了类似于地址的东西。
代码:
#include <iostream>
#include <sstream>
void doStuff(const std::iostream& msg)
{
std::cerr << msg << std::endl;
}
int main(void)
{
doStuff(std::stringstream("av"));
}输出为: 0xbff4eb40
有人能解释一下为什么我在传递rvalue时会得到一个地址吗?
为什么我不能按值传递字符串流?
发布于 2012-03-12 04:48:23
您可能希望访问stringstream存储其数据的字符串:
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没有定义(此方法仅在字符串流上可用)。
发布于 2012-03-12 04:46:42
您可以获得一个地址,因为它(与其他流一样)具有到void *的转换(这主要用作布尔值,用于查看读/写流是否失败)。
你不能通过值来传递它,因为streams (一般来说,不仅仅是stringstreams)不支持复制和/或赋值。
要打印流的内容,可以执行以下操作:
void dostuff(std::iostream &msg) {
std::cerr << msg.rdbuf() << "\n";
}编辑:这是一个完整的演示程序:
#include <iostream>
#include <sstream>
void show(std::ostream &os) {
std::cout << os.rdbuf() << "\n";
}
int main(){
std::stringstream test("whatever");
show(test);
return 0;
}当我执行它时,我得到的输出是预期的“随便”。
https://stackoverflow.com/questions/9658693
复制相似问题