C++ 运算符 << (void*)

标签 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<<(const void* p) 而不是 ostream::operator<<(const char *) 显示的吗?

最佳答案

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

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

关于C++ 运算符 << (void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24161979/

相关文章:

c++ - boost asio http 客户端 - io_service.run()

c++ - 根据另一个数组的顺序对一个数组进行排序

c++ - 巨大的整数错误。调试断言失败

java - 使用 XStream 为可外部化的类使用默认的 Java 序列化

language-agnostic - 复合赋值运算符,如果值被修改(同时)会发生什么?

Java boolean 值 |= 运算符

c++ - Windows 链接

c++ - Boost Fusion 和 Boost property_tree 用于结构的反序列化

使用运算符计算数字

django - 如果值为空,则自定义 Django Rest Framework Serializer 字段未运行 `to_representation()`