Неопределенное поведение при работе с 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

В чем может быть проблема ?


Я попытался реализовать перегрузку оператора << точными типами, а не шаблоном, и все равно получаю ту же ошибку.


Ответы (0 шт):