ostream chaining, output order

У меня есть функция, которая принимает 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

Я хотел бы понять, что здесь происходит. Неужели обычная функция имеет приоритет над operator<<, и поэтому порядок вывода меняется на противоположный? Как правильно написать функцию, которая вставляет данные в ostream, но при этом может работать с operator<<?

10
задан LowTechGeek 19 January 2012 в 18:22
поделиться