我很好奇 std::cout 是否有返回值,因为当我这样做时:
cout << cout << "";
打印了一些十六进制代码。这个打印值的意义是什么?
cout << cout
的操作数是用户自定义类型,所以表达式实际上是一个函数调用。编译器必须找到最佳匹配操作数的operator<<
,在这种情况下,两个操作数都是std::ostream
类型。std::ostream
具有允许转换为void*
的转换运算符。这用于启用将流的状态作为布尔条件进行测试(即它允许if (cout)
工作)。cout
使用此转换运算符隐式转换为void const*
,然后调用接受ostream&
和void const*
的operator<<
重载来写入此指针值。ostream
到void*
转换得到的实际值是未指定的。规范仅强制要求如果流处于错误状态,则返回空指针,否则返回非空指针。operator<<
重载确实有返回值:它们返回作为操作数提供的流。这正是允许插入操作(对于输入流,使用>>
进行提取操作)链式调用的原因。cout
并没有返回值。它是ostream
类型的一个对象。而operator <<
有一个返回值,它返回一个对cout
的引用。
参见http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/了解更多信息。
唯一匹配的签名是:
ostream& operator<< (ostream& ( *pf )(ostream&));
因此它返回指向 operator<<
成员的指针。
这与James的回答中所描述的相同。 :)
operator<<
函数的地址”。更有可能的是,它被评估为(cout << cout) << ""
,而内部调用显示了cout
转换为void*
后的任何内容。 - cdhowie我相信那应该是被打印输出的 ostream 对象的地址