C++标准是否保证将rdbuf的返回值传入流输出运算符时会打印缓冲区内容?
Is outputting a
std::stringbuf* via std::cout guaranteed by the C++ standard? 先看你给出的代码片段:
std::stringstream ss; ss << "hello world!\n"; auto a = ss.rdbuf(); std::cout << a; // 输出"hello world!"
变量a是指向std::stringbuf类型对象的指针。在GCC9.4环境下,将其传入流输出运算符<<时,会打印出a所指向的流缓冲区的内容。现在想确认:该行为仅是GCC中std::stringbuf实现方式导致的偶然现象,还是由C++语言标准保证始终生效?
好问题!这个行为绝对不是GCC独有的偶然现象,而是C++标准明确保证的行为,咱们来拆解一下背后的原因:
- 首先,C++标准为
std::basic_ostream(std::cout的底层类型)定义了专门针对std::basic_streambuf*的输出运算符重载。也就是说,std::ostream& operator<<(std::streambuf* sb);是标准要求所有合规编译器必须提供的接口。 - 这个重载的行为是完全标准化的:如果传入的指针
sb不为空,运算符会从sb指向的流缓冲区中读取所有可用字符,并将它们写入到目标输出流(这里就是std::cout),直到遇到流结束标记(EOF)或者操作失败为止。操作完成后,它会返回输出流对象本身。 - 你的代码里,
std::stringbuf是std::streambuf的派生类,所以ss.rdbuf()返回的std::stringbuf*可以隐式转换为std::streambuf*,完美匹配这个标准重载。因此不管你使用GCC、Clang还是MSVC等符合标准的编译器,这段代码都会稳定输出hello world!。
内容的提问来源于stack exchange,提问作者John Z. Li
相关产品推荐
相关产品推荐

