C ++运算符<< (无效*)

时间:2014-06-11 11:39:58

标签: c++ serialization operators iostream

我有以下代码

#include <iostream>
#include <sstream>

class oTraceStream : public std::ostringstream
{
public :

    oTraceStream(const int from, const unsigned int level)
    : m_from(from)
    , m_level(level)
    {
    }

    virtual ~oTraceStream(void)
    {
        std::cout << str();
    }

private :
    // unused for this sample
    int m_from;
    unsigned int m_level;
};


int main(int argc, char* argv[])
{
    oTraceStream(0,0) << "1st part " << " 2nd part" << std::endl;
    {
        oTraceStream tmp(0,0);
        tmp << "1st part " << " 2nd part" << std::endl;
    }

    return 0;
}

使用MS Visual 6.0或旧的gcc(2.x),2个输出是相同的。

1st part  2nd part
1st part  2nd part

使用MS Visual 2008或最近的gcc(4.x),第一行的第一个字符串显示为指针

0x80493ec 2nd part
1st part  2nd part

有人可以解释一下为什么,最近的编译器第一行使用ostream :: operator&lt;&lt;(const void * p)而不是ostream :: operator&lt;&lt;(const char *)?

1 个答案:

答案 0 :(得分:4)

void const *重载是std::ostream的成员,而char const *重载是非成员。临时oTraceStream(0,0)对象不会绑定到非成员operator <<使用的非const引用,但它将绑定到成员使用的隐式this参数。

C ++ 11导致行为回到您的期望,因为它添加了一个operator <<,它接受​​一个rvalue(例如一个临时对象子表达式)并将其切换到左值(例如一个命名对象子表达式)。