流字符串流是libstdc ++扩展吗?

gnz*_*lbg 1 c++ stringstream libstdc++ libc++

流式传输stringstreamlibstdc ++扩展?这个程序与编译gcc-4.2,gcc-4.7-2 (using -std=c++03)和铛3.2使用-std=c++11libstdc++(感谢安迪警车,见注释).它不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;
}
Run Code Online (Sandbox Code Playgroud)

通过查看ofstream的构造函数,它可以采用a std::basic_streambuf<CharT, Traits>*或a basic_ostream& st.字符串流是一个std::basic_istream,但两者都是std::basic_ios<CharT, Traits>如此,我猜它应该工作.

以下更改使代码在clang下编译:

  std::cout << "ss: " << s.str() << std::endl;
Run Code Online (Sandbox Code Playgroud)

做正确的方法是什么?cout << s;还是cout << s.str();

Bo *_*son 7

不,这是C++ 03和C++ 11之间的区别.所有流都有一个转换运算符,可以使用if (s)和启用代码while (s).在C++ 03中,这通常operator void*()或类似的东西.

在C++ 11中,我们有明确的运算符,其中一个explicit operator bool()适用于if (s)但不适用于cout << s.

  • @gnzlbg:代码*在C++ 03下编译*,但对于任何理智的单词定义都不*.*具体来说,它打印出的内容通常是一个地址,**不是你的字符串流的内容. (5认同)