std :: cout有返回值吗?

use*_*323 9 c++ cout return

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

cout << cout << "";
Run Code Online (Sandbox Code Playgroud)

打印一些hexa代码.这印刷价值的含义是什么?

Jam*_*lis 19

因为操作数cout << cout是用户定义的类型,所以表达式实际上是函数调用.编译器必须找到operator<<与操作数匹配的最佳值,在本例中它们都是类型std::ostream.

有许多候选运算符重载可供选择,但我只是按照通常的重载决策过程描述最终被选中的那个.

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

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

需要注意的是,从所得到的实际值ostreamvoid*转换是不确定的.规范仅强制要求如果流处于错误状态,则返回空指针,否则返回非空指针.


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


Luc*_*ore 14

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

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

唯一匹配的签名是:

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

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

詹姆斯答案中的一个.:)