10

我很好奇 std::cout 是否有返回值,因为当我这样做时:

cout << cout << "";

打印了一些十六进制代码。这个打印的值是什么意思?

4

3 回答 3

19

因为 的操作数cout << cout是用户定义的类型,所以表达式实际上是一个函数调用。编译器必须找到operator<<与操作数匹配的最佳值,在这种情况下,它们都是 type std::ostream

有许多候选运算符重载可供选择,但我将按照通常的重载解决过程来描述最终被选中的一个。

std::ostream有一个转换运算符,允许转换为void*. 这用于将流的状态测试为布尔条件(即,它允许if (cout)工作)。

右侧操作数表达式cout被隐式转换为void const*使用此转换运算符,然后调用采用 an和 a的operator<<重载来写入此指针值。ostream&void const*

请注意,由ostreamtovoid*转换产生的实际值是未指定的。该规范仅要求如果流处于错误状态,则返回空指针,否则返回非空指针。


流插入的operator<<重载确实有一个返回值:它们返回作为操作数提供的流。这就是允许链接插入操作(对于输入流,使用 提取操作>>)。

于 2012-06-11T20:39:04.383 回答
15

cout 没有返回值cout是一个类型的对象ostreamoperator <<有一个返回值,它返回一个对cout.

请参阅http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/以供参考。

唯一匹配的签名是:

ostream& 运算符<< (ostream& ( *pf )(ostream&));

所以它返回指向operator<<成员的指针。

詹姆斯回答中的那个。:)

于 2012-06-11T20:36:04.473 回答
1

我相信那将是“”打印到的 ostream 对象的地址

于 2012-06-11T20:37:32.263 回答