Неопределенное поведение при работе с std::ostringstream
Есть класс LoggerWrap:
class LoggerWrap
{
public:
LoggerWrap()
{
}
void write(const std::string &str) const
{
std::cout << str << std::endl;
}
class TmpLog
{
friend class LoggerWrap;
public:
~TmpLog()
{
if (flush) {
logger.write(buf.str());
buf.str("");
}
}
template<typename T> TmpLog &operator<<(const T &data)
{
buf << data;
return *this;
}
TmpLog(const TmpLog &) = delete;
private:
TmpLog(const LoggerWrap &logger, std::ostringstream &buf)
:logger(logger), buf(buf)
{
}
TmpLog(TmpLog &&that) : logger(that.logger), buf(that.buf), flush(that.flush)
{
that.flush = false;
}
const LoggerWrap &logger;
std::ostringstream &buf;
bool flush = true;
};
template<typename T> TmpLog operator<<(const T &data)
{
buf.flags(defFmtFlags);
TmpLog tmlLog(*this, buf);
return std::move(tmlLog << data);
}
private:
std::ostringstream buf;
std::ios::fmtflags defFmtFlags;
};
Этот класс лишь демонстрирует базовую функциональность. Проблема заключается в том, что при каждом запуске программы, я получаю различные результаты, а именно:
int main(int argc, char *argv[])
{
LoggerWrap wrap;
for (int i = 0; i < 10; ++i) {
wrap << i << " : " << 99;
}
return EXIT_SUCCESS;
}
При запуске этого кода, иногда я получаю такой вот вывод:
0 : 99
1 : 99
2 : 99
3 : 99
4 : 99
5 : 99
6 : 99
7 : 99
8 : 99
9 : 99
а иногда
0 : 63
1 : 63
2 : 63
3 : 63
4 : 63
5 : 63
6 : 63
7 : 63
8 : 63
9 : 63
В чем может быть проблема ?
Я попытался реализовать перегрузку оператора << точными типами, а не шаблоном, и все равно получаю ту же ошибку.