std::cout有返回值吗?

11

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

cout << cout << "";

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


1
虽然这个问题本身不是一个完全的重复,但是之前的问题的大部分答案同样适用于这里。 - Jerry Coffin
3个回答

21
因为cout << cout 的操作数是用户自定义类型,所以表达式实际上是一个函数调用。编译器必须找到最佳匹配操作数的operator<<,在这种情况下,两个操作数都是std::ostream类型。
有许多候选的运算符重载可供选择,但我只会描述最终被选中的那个,按照通常的重载解析过程进行。 std::ostream具有允许转换为void*的转换运算符。这用于启用将流的状态作为布尔条件进行测试(即它允许if (cout)工作)。
右操作数表达式cout使用此转换运算符隐式转换为void const*,然后调用接受ostream&void const*operator<<重载来写入此指针值。
注意,从ostreamvoid*转换得到的实际值是未指定的。规范仅强制要求如果流处于错误状态,则返回空指针,否则返回非空指针。
流插入的operator<<重载确实有返回值:它们返回作为操作数提供的流。这正是允许插入操作(对于输入流,使用>>进行提取操作)链式调用的原因。

16

cout并没有返回值。它是ostream类型的一个对象。而operator <<有一个返回值,它返回一个对cout的引用。

参见http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/了解更多信息。

唯一匹配的签名是:

ostream& operator<< (ostream& ( *pf )(ostream&));

因此它返回指向 operator<< 成员的指针。

这与James的回答中所描述的相同。 :)


1
我看不出这段代码在语义上如何评估为“打印operator<<函数的地址”。更有可能的是,它被评估为(cout << cout) << "",而内部调用显示了cout转换为void*后的任何内容。 - cdhowie

1

我相信那应该是被打印输出的 ostream 对象的地址


@Luchian已经提供了一个参考,比我快。 - Kyle Preiksa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接