我有一个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<<()
接听电话之前就已调用。为什么会这样?它是在标准中指定的,在这里首先调用的是什么,或者我只是得到未定义的行为?
答案 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<<
的参数。因此,根据标准,它们的顺序未指定:它不是未定义的行为,但编译器可以自由选择它喜欢的顺序。