这可能是一个初学者的问题,理解cout如何工作可能是关键。如果有人可以联系到一个好的解释,那就太好了。
cout<<cout
和cout<<&cout
在linux x86计算机上打印以4分隔的十六进制值。
答案 0 :(得分:16)
cout << cout
相当于cout << cout.operator void *()
。这是在C ++ 11之前用来确定iostream是否处于失败状态的惯用语,并在std::ios_base
中实现;它通常返回static_cast<std::ios_base *>(&cout)
的地址。
cout << &cout
打印出cout
的地址。
由于std::ios_base
是cout
的虚拟基类,因此它可能不一定与cout
连续。这就是它打印不同地址的原因。
答案 1 :(得分:5)
cout << cout
正在使用为布尔测试目的而存在的void*
内置转换。出于某种无趣的原因,您的实现使用了一个4字节的地址到std::cout
对象中。在C ++ 11中,这个转换被删除了,这不应该编译。
cout << &cout
正在打印std::cout
对象的地址。
答案 2 :(得分:4)
cout << &cout
正在传递cout
cout
的地址。
cout << cout
正在使用cout
打印隐式投射void*
到operator void*
指针的值。
答案 3 :(得分:3)
如上所述,cout << cout
使用为bool测试提供的void*
转换(while (some_stream){ ... }
等)。
它打印值&amp; cout + 4,因为转换是在基础实现中完成的,并且转换为它自己的类型,这是from libstdc++:
operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
答案 4 :(得分:0)
cout<<&cout
正在将cout
的地址传递给流。