您的代码的行为是未指定根据 C++ 标准。
解释
以下内容(我删除了std::endl
为了简单起见)
std::cout << "Hello, world!" << print( std::cout );
等价于:
operator<<(operator<<(std::cout, "Hello, World!"), print(std::cout));
这是一个函数调用,传递两个参数:
- 第一个参数是:
operator<<(std::cout, "Hello, World!")
- 第二个参数是:
print(std::cout)
现在,标准没有指定计算参数的顺序。这是未指定。但是你的编译器似乎首先评估第二个参数,这就是它打印的原因“你好吗?”首先,将第二个参数计算为 type 的值std::ostream&
然后它被传递给上面显示的调用(该值是对象std::cout
本身)。
为什么要输出十六进制?
您会得到十六进制输出,因为第二个参数的计算结果为std::cout
,它被打印为十六进制数,因为std::cout
隐式转换为指针值void*
类型,这就是为什么它被打印为十六进制数字。
尝试这个:
void const *pointer = std::cout; //implicitly converts into pointer type!
std::cout << std::cout << std::endl;
std::cout << pointer << std::endl;
它将为两者打印相同的值。例如,这个例子位于ideone http://ideone.com/GwsjQ打印这个:
0x804a044
0x804a044
另请注意,我没有使用explicit投掷;相当std::cout
is 隐含地转换为指针类型。
希望有帮助。
编写将数据插入到数组中的函数的正确方法是什么?ostream
但这也可以与operator<<
?
什么时候取决于你所说的链接是什么意思?显然,以下内容是行不通的(如上所述):
std::cout << X << print(std::cout) << Y << Z; //unspecified behaviour!
不管你怎么写print()
.
然而,这是明确定义的:
print(std::cout) << X << Y << Z; //well-defined behaviour!