1

流式传输是stringstreamlibstdc++ 扩展吗?该程序使用and编译gcc-4.2,gcc-4.7-2 (using -std=c++03)和 clang 3.2 (感谢 Andy Prowl,请参阅评论)。它不能使用和编译。-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;
}

通过查看 ofstream 的构造函数,它可以采用 astd::basic_streambuf<CharT, Traits>*或 a basic_ostream& st。stringstream 是 a std::basic_istream,但是两者都是,std::basic_ios<CharT, Traits>所以我猜它应该可以工作。

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

  std::cout << "ss: " << s.str() << std::endl;

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

4

4 回答 4

7

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

在 C++11 中,我们有显式运算符,其中 anexplicit operator bool()适用于if (s),但不适用于cout << s

于 2013-02-08T18:20:14.320 回答
4

实际上,这只会在 C++98 和 C++03 中编译,因为所有流类都隐式转换为void*由于operator void*()转换函数的存在,因此sinstd::cout << svoid*隐式转换为。

然而,在 C++11 中,代码将无法编译,因为 C++11 已将显式化,它可以根据上下文转换为布尔值,而不是void*,例如 inifwhile

于 2013-02-08T18:23:32.713 回答
1

它应该与所有 C++ 编译器一起编译,但它并没有达到您的预期。所有流都隐式转换为可在布尔表达式中使用的内容:to void*bool. <<这两种类型都有一个运算符。

当您想将一个流转储到另一个流时,正确的方法是:

std::cout << s.rdbuf();

(这对我来说似乎有点奇怪,这作为格式化插入运算符被重载,因为它复制了 的全部内容streambuf,没有任何格式化,甚至忽略了宽度。)

于 2013-02-08T18:27:24.020 回答
-1

流式传输 std::stringstream 没有重载,但您可以使用

std::cout << "ss: " << s.str() << std::endl;
于 2013-02-08T18:20:35.403 回答