Как вернуть fstream (C++0x)

Пожалуй, я перейду сразу к делу и начну с кода:

#include <iostream>
#include <fstream>
#include <string>

class test : public std::ofstream
{
    public:
        test(const std::string& filename) { this->open(gen_filename(filename)); };
        test(const test&) = delete;
        //test(test&& old) = default; // Didn't compile
        test(test&& old) {};
    private:
        std::string gen_filename(const std::string& filename) 
        { return filename + ".tmp"; }
};

int main()
{
    auto os = test("testfile");
    os << "Test1\n";
    os << "Test2\n";
}

По сути, мне нужно вернуть ofstream. Конечно, вы не можете скопировать ofstream, поэтому я возился с кодом в классе test и добился того, что вышеприведенное скомпилировалось и работает, как вы и ожидали (на gcc 4.5).

Но у меня плохое предчувствие, что это просто из-за того, что мой компилятор делает "оптимизацию возвращаемого значения" (RTO) на "auto os = test()". Действительно, если модифицировать до следующего:

int main()
{
    auto os = test("testfile");
    os << "Test1\n";
    auto os2 = std::move(os);
    os2 << "Test2\n";
}

Я больше не получаю на выходе ни Test1, ни Test2.

Дело в том, что класс "test" не копируемый, поэтому нет шансов, что ofstream будет продублирован. Я просто хочу иметь возможность возвращать его из функции. И я, кажется, могу сделать это с помощью GCC.

Я бы предпочел не разыменовывать умные указатели на выделенный из кучи ofstream и не открывать файл заново, поскольку сейчас он работает без этих действий. У меня просто есть ощущение, что я немного "нестандартен" в своем подходе, поэтому стандартный способ сделать то, что я описал, был бы замечательным.

7
задан Deduplicator 16 November 2015 в 00:54
поделиться