流式传输stringstream是libstdc++扩展吗?此程序使用-std=c++11和libstdc++编译gcc-4.2、gcc-4.7-2 (using -std=c++03)和Clang3.2(感谢Andy Prowl,请参阅注释)。
#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。stringstream是一个std::basic_istream,但是两者都是std::basic_ios<CharT, Traits>,所以我猜它应该可以工作。
std::cout << "ss: " << s.str() << std::endl;正确的方法是什么?cout << s;还是cout << s.str();?
发布于 2013-02-09 02:20:14
不,这是C++03和C++11之间的区别。所有的流都有一个转换运算符,可以使用if (s)和while (s)启用代码。在C++03中,这通常是operator void*()或类似的东西。
在C++11中,我们有显式运算符,其中explicit operator bool()适用于if (s),但不适用于cout << s。
发布于 2013-02-09 02:23:33
实际上,这只能在C++98和C++03中编译,因为所有的流类都隐式地转换为void*,因为operator void*()转换函数的存在,因此std::cout << s中的s将隐式地转换为void*。
然而,在C++11中,代码将无法编译,因为C++11已经显式地将其转换为布尔值,而不是void*,例如在if和while中。
发布于 2013-02-09 02:27:24
它应该可以使用所有C++编译器进行编译,但它不会执行您所期望的操作。所有的流都隐式地转换成可以在布尔表达式中使用的东西:void*或bool。这两种类型都有一个<<运算符。
当您想要将一个流转储到另一个流时,正确的方法应该是:
std::cout << s.rdbuf();(对我来说,这作为格式化插入操作符被重载似乎有点奇怪,因为它复制了streambuf的全部内容,没有任何格式化,甚至忽略了宽度。)
https://stackoverflow.com/questions/14778790
复制相似问题