首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >串流是libstdc++扩展吗?

串流是libstdc++扩展吗?
EN

Stack Overflow用户
提问于 2013-02-09 02:13:40
回答 4查看 590关注 0票数 1

流式传输stringstream是libstdc++扩展吗?此程序使用-std=c++11libstdc++编译gcc-4.2gcc-4.7-2 (using -std=c++03)和Clang3.2(感谢Andy Prowl,请参阅注释)。

代码语言:javascript
复制
#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>,所以我猜它应该可以工作。

代码语言:javascript
复制
  std::cout << "ss: " << s.str() << std::endl;

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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

票数 7
EN

Stack Overflow用户

发布于 2013-02-09 02:23:33

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

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

票数 4
EN

Stack Overflow用户

发布于 2013-02-09 02:27:24

它应该可以使用所有C++编译器进行编译,但它不会执行您所期望的操作。所有的流都隐式地转换成可以在布尔表达式中使用的东西:void*bool。这两种类型都有一个<<运算符。

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

代码语言:javascript
复制
std::cout << s.rdbuf();

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14778790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档