c – ostream链接,输出顺序

我有一个函数,它将一个ostream引用作为参数,将一些数据写入流,然后返回对该相同流的引用,如下所示:

#include <iostream>

std::ostream& print( std::ostream& os ) {
  os << " How are you?" << std::endl;
  return os;
}

int main() {
  std::cout << "Hello, world!" << print( std::cout ) << std::endl;
}

此代码的输出是:

 How are you?
Hello, world!0x601288

但是,如果我将链接表达式分成两个语句,就像这样

int main() {
  std::cout << "Hello, world!";
  std::cout << print( std::cout ) << std::endl;
}

然后我至少在输出中得到正确的顺序,但仍然得到一个十六进制值:

Hello, world! How are you?
0x600ec8

我想了解这里发生了什么.普通函数优先于运算符<<,这就是输出顺序反转的原因吗?编写将数据插入ostream的函数的正确方法是什么,但也可以使用operator<<<?

解决方法:

根据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)

现在,标准没有指定参数的计算顺序.它没有具体说明.但是你的编译器似乎首先评估第二个参数,这就是它打印“你好吗?”的原因.首先,将第二个参数计算为std :: ostream&类型的值.然后传递给上面显示的调用(该值是对象std :: cout本身).

为什么十六进制输出?

你得到十六进制输出,因为第二个参数计算为std :: cout,它被打印为十六进制数,因为std :: cout隐式转换为void * type的指针值,这就是为什么它被打印为十六进制数.

尝试这个:

void const *pointer = std::cout; //implicitly converts into pointer type!
std::cout << std::cout << std::endl;
std::cout << pointer << std::endl;

它将为两者打印相同的值.例如,此示例在ideone打印此:

0x804a044
0x804a044 

还要注意我没有使用显式转换;而std :: cout被隐式转换为指针类型.

希望有所帮助.

What is the proper way to write a function that inserts data into an ostream but that can also chain with operator<<?

什么时候取决于链接的意思?显然,以下内容不起作用(如上所述):

std::cout << X << print(std::cout) << Y << Z; //unspecified behaviour!

无论你怎么写print().

然而,这是明确定义的:

print(std::cout) << X << Y << Z; //well-defined behaviour!
上一篇:javascript – jQuery ajax调用链接多个依赖项


下一篇:php – 具有不同返回值的函数链接?