ostream
重载了operator void*()
,所以这是调用operator <<
的最佳匹配,(void*)cout
的转换结果被打印出来,这在你的情况下即为该地址。请记住,cout
是一个对象。cout.operator<<((void*)cout);
operator+
执行减法,但区别在于,这里已经深入人心,使其在上下文中有意义,而我的例子则是荒谬的。 - chriscout
是一个ostream
对象,它有一个重载的插入(<<
)运算符。如果我们看一下ostream
类的构造函数,会发现需要传递一个参数,这个参数是指向streambuf
对象的指针。streambuf
对象通常与一个字符序列相关联,用于读写数据。对于控制台应用程序,标准输出会有一个这样的字符缓冲区,可能在cout内部使用。文档中说我们不应该直接实例化ostream
对象,而是使用任何派生类ofstream
或ostringstream
,从而将注意力转移到stdout上。
关于打印地址的问题,我认为Luchian Grigore是正确的。
这个问题可以让你了解cout
对象是如何实例化的:How is the object std::cout constructed/instantiated