正在流式传输stringstream
libstdc ++扩展程序吗?该程序使用gcc-4.2
和gcc-4.7-2 (using -std=c++03)
与-std=c++11
,libstdc++
和clang 3.2进行编译(感谢Andy Prowl,请参阅评论)。它不会使用clang 3.2
和-std=c++11
与-stdlib=libc++
进行编译。
#include<iostream>
#include<sstream>
int main() {
std::stringstream s; s << "b";
std::cout << "ss: " << s << std::endl;
return 0;
}
通过查看ofstream的构造函数,可以使用std::basic_streambuf<CharT, Traits>*
或basic_ostream& st
。字符串流是std::basic_istream
,但两者都是std::basic_ios<CharT, Traits>
所以我猜它应该有效。
以下更改使代码在clang下编译:
std::cout << "ss: " << s.str() << std::endl;
这样做的正确方法是什么? cout << s;
或cout << s.str();
?
答案 0 :(得分:7)
不,这是C ++ 03和C ++ 11之间的区别。所有流都有一个转换运算符,可以使用if (s)
和while (s)
启用代码。在C ++ 03中,这通常是operator void*()
或类似的东西。
在C ++ 11中,我们有明确的运算符,其中explicit operator bool()
适用于if (s)
,但不适用于cout << s
。
答案 1 :(得分:4)
实际上,这将在C ++ 98和C ++ 03中仅编译 ,因为由于存在void*
转换函数,所有流类隐含都会转换为operator void*()
因此,s
中的std::cout << s
会隐式转换为void*
。
然而,在C ++ 11中,代码将无法编译,因为C ++ 11已经显式化,可以在上下文中转换为布尔值,而不是void*
,例如在if
和while
。
答案 2 :(得分:1)
它应该与所有C ++编译器一起编译,但它不会做什么
你可能会期待。所有流都有隐式转换
可以在布尔表达式中使用的东西:要么
void*
或bool
。并且两者都有<<
运算符
这些类型。
如果要将一个流转储到另一个流中,请使用正确的方法 将是:
std::cout << s.rdbuf();
(这对我来说似乎有点奇怪,因为它被重载了
格式化插入运算符,因为它复制了整个
streambuf
的内容,没有任何格式,甚至
忽略宽度。)
答案 3 :(得分:-1)
流式传输std :: stringstream没有重载,但您可以使用
std::cout << "ss: " << s.str() << std::endl;