Следующий фрагмент - это упрощенная версия используемого регистратора. Он расширяет std::ostringstream
и может быть заполнен с помощью <<
-оператора. После уничтожения все содержимое записывается в std::cout
.
Написание (<<
) непосредственно во временный объект Logger()
, я ожидаю, что он напечатает этот ввод, однако он только печатает адрес чего-то на std::cout
. При записи в ссылку временного объекта Logger().stream()
работает как ожидалось.
Почему это происходит?
Btw, это поведение происходит только на С++ 98-land (ideone), которое я должен использовать. С С++ 11 (coliru) и С++ 14 (ideone) оба вызова варианты работают так, как ожидалось. Что по-другому в С++ 11/14?
#include <iostream>
#include <sstream>
class Logger : public std::ostringstream
{
public:
~Logger()
{
std::cout << this->str() << std::endl;
}
Logger& stream()
{
return *this;
}
};
int main( int argc, char ** argv )
{
// 1.
// Prints an address, e.g. 0x106e89d5c.
Logger() << "foo";
// 2.
// Works as expected.
Logger().stream() << "foo";
// What is the difference between 1. and 2.?
return 0;
}