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

时间:2013-02-08 18:13:40

标签: c++ stringstream libstdc++ libc++

正在流式传输stringstream libstdc ++扩展程序吗?该程序使用gcc-4.2gcc-4.7-2 (using -std=c++03)-std=c++11libstdc++和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();

4 个答案:

答案 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*,例如在ifwhile

答案 2 :(得分:1)

它应该与所有C ++编译器一起编译,但它不会做什么 你可能会期待。所有流都有隐式转换 可以在布尔表达式中使用的东西:要么 void*bool。并且两者都有<<运算符 这些类型。

如果要将一个流转储到另一个流中,请使用正确的方法 将是:

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

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

答案 3 :(得分:-1)

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

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