运营商LT;<链接和函数调用顺序

时间:2014-11-13 14:02:55

标签: c++

我有一个centered(int a, ostream& os)函数,它会copyfmt(os)a输出到其临时stringstream

我现在这样称呼它:

std::cout << std::hex << centered(a,cout) << std::dec;

但输出仍然显示为十进制。 OTOH,如果我把它改成

std::cout << std::hex;
std::cout << centered(a,cout) << std::dec;

我得到正确的十六进制输出。

似乎centered()在任何operator<<()接听电话之前就已调用。为什么会这样?它是在标准中指定的,在这里首先调用的是什么,或者我只是得到未定义的行为?

1 个答案:

答案 0 :(得分:4)

operator<<从左到右关联,这意味着第一个语句

std::cout << std::hex << centered(a,cout) << std::dec;

相当于

operator<<(
  operator<<(
    operator<<(
      std::cout, 
      std::hex
    ), centered(a, cout)
  ), std::dec
);

使用此语法,operator<<(std::cout, std::hex)centered(a, cout)似乎都是operator<<的参数。因此,根据标准,它们的顺序未指定:它不是未定义的行为,但编译器可以自由选择它喜欢的顺序。