流式传输字符串流是libstdc++扩展吗?
Is streaming a stringstream a libstdc++ extension?
流式传输stringstream
是libstdc++扩展吗?该程序使用 -std=c++11
和 libstdc++
编译了 gcc-4.2
、gcc-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*
,例如在 if
和 while
中。
它应该使用所有C++编译器进行编译,但它不做什么你可能会想到。 所有流都隐式转换为可以在布尔表达式中使用的内容:要么 void*
或bool
. 两者都有一个<<
运算符这些类型。
当您想将一个流转储到另一个流中时,正确的方法将:
std::cout << s.rdbuf();
(这对我来说似乎有点奇怪,因为超载格式插入运算符,因为它复制了整个streambuf
的内容,没有任何格式,甚至忽略宽度。
流式传输 std::stringstream 没有重载,但您可以使用
std::cout << "ss: " << s.str() << std::endl;
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 在运行时读取 libstdc++ 版本
- libstdc++ 文件系统中未初始化的用法?
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- 在Adobe Flex本机扩展中使用libc++而不是libstdc++
- 流式传输字符串流是libstdc++扩展吗?
- 在python扩展(.so)中同时链接libgfortran和libstdc++