流式传输字符串流是libstdc++扩展吗?

Is streaming a stringstream a libstdc++ extension?

本文关键字:扩展 libstdc++ 传输 字符串      更新时间:2023-10-16

流式传输stringstream是libstdc++扩展吗?该程序使用 -std=c++11libstdc++ 编译了 gcc-4.2gcc-4.7-2 (using -std=c++03) 和 clang 3.2(感谢 Andy Prowl,请参阅注释(。它不会使用 -std=c++11-stdlib=libc++ 进行clang 3.2编译。

#include<iostream>
#include<sstream>
int main() {
  std::stringstream s; s << "b";
  std::cout << "ss: " << s << std::endl;
  return 0;
}

通过查看流的构造函数,可能需要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();

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

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

实际上,

只会在 C++98 和 C++03 中编译,因为由于存在operator void*()转换函数,所有流类都隐式转换为void*,因此std::cout << s中的s将隐式转换为void*

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

它应该使用所有C++编译器进行编译,但它不做什么你可能会想到。 所有流都隐式转换为可以在布尔表达式中使用的内容:要么 void*bool. 两者都有一个<<运算符这些类型。

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

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

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

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

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