2009-11-19 39 views
5

我一直在编写一个定制的std::streambuf作为日志系统的一部分。但是,我遇到了未正确格式化的流的第一部分输出问题。std :: ostream没有正确格式化const char *第一次使用

下面是不使用任何自定义streambufostream类减少的测试用例:

#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++ --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. 

注意,第一字符串文字(“测试“)被格式化为通用指针(字符串的地址以十六进制输出),而第二个字符串文本格式正确。

我能想到的唯一情况是直接使用新构造的std::ostream(即不将它放入变量)是无效的。如果是这种情况,我很想知道究竟是什么使其无效(我认为这与iostreams没有任何关系,而是与评估顺序或与构造函数的相互作用等)。如果这不是问题,那么是什么?

回答

8

问题是您不能写入临时流对象。这:

std::ostream(coutbuf) << "blah"; 

不能按预期工作,因为对于operator<<()左手参数是右值。然而,重载为自由函数的所有经营者采取非const引用到一个流作为其左侧参数:

std::ostream& operator<<(std::ostream&, ...); 

由于右值不绑定到非const引用,它们不能被调用。

我怀疑你的标准库实现实现<<const char*作为一个免费的功能,也因此回落到一些<<这就是std::ostream成员。在您的实现中,似乎是将任何指针输出为void*

底线:不要尝试写入临时流对象。

1

您不能像这样使用临时流对象。为临时变量命名。

#include <iostream> 

int main() 
{ 
    std::streambuf *coutbuf = std::cout.rdbuf(); 
    std::ostream os(coutbuf); 
    os << "test" << ": writing to cout using a separate ostream." << std::endl; 
    return 0; 
} 
相关问题