我一直在编写一个自定义std::streambuf
作为日志系统的一部分。但是,我遇到了来自流的第一段输出格式不正确的问题。
这是一个不使用任何自定义streambuf
或ostream
类的简化测试用例:
#include <iostream>
int main()
{
std::streambuf *coutbuf = std::cout.rdbuf();
std::ostream(coutbuf) << "test" << ": writing to cout using a separate ostream." << std::endl;
return 0;
}
使用 g++ 编译:
$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu8) 4.4.1
$ g++ -o fail reduced-case.cpp
$ ./fail
0x400c80: writing to cout using a separate ostream.
请注意,第一个字符串文字(“test”)被格式化为通用指针(字符串的地址以十六进制输出),而第二个字符串文字的格式正确。
我唯一能想到的是,直接使用这样的新构造std::ostream
(即,不将其放入变量)是无效的。如果是这种情况,我非常想知道究竟是什么使它无效(我认为这与 iostreams 无关,而是与评估顺序或与构造函数或其他东西的交互)。如果这不是问题,那是什么?