2011-01-28 11 views
7

私は右のそれに入ると、コードで始まると思う:(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をコピーすることはできませんので、私はクラステストでコードを覗いてみました。上記のコードをgcc 4.5で期待通りにコンパイルして動作させました。

しかし、これは私のコンパイラが "auto os = test()"の "戻り値の最適化"(RTO)を行っていることによると思います。実際、次のように変更する場合:

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

出力にTest1とTest2の両方が表示されなくなりました。

「テスト」というクラスはコピーできないため、ストリームが重複することはありません。私はちょうど関数からそれを返すことができるようにしたい。そして、私はGCCでそれを行うことができるようです。

私は、ofstreamを割り当てられたヒープへのスマートポインタを逆参照したり、ファイルを再オープンしたりするのではなく、現在そのようなことをすることなく動作します。私は自分のアプローチで少し「非標準的」な気がしているので、私が記述したことを行うための標準的な方法は素晴らしいでしょう。

答えて

15

GCC C++0x Library Featuresページで

は、読み込む項目27.9を見て、持っている: - ファイルベースのストリーム - 部分 -

27.9がありません移動とスワップの操作

私はおそらくgccに問題があると思います。

+0

ええ、それはそれをするでしょう。しかし、良い見つける。 – GManNickG

+0

まだ本当ですか? –

+0

いいえのようには見えません。できるだけ質問と回答を編集してください。 – Clinton

2

問題はこれである:

test(test&& old) {}; 

これはイエス、あなたが右辺値testから新しいtestを構築することができますが、それは単にデフォルトが構築されているお使いのベース、(開いていないファイル)については何も言いません。あなたが望むのは、

test(test&& old) : std::ofstream(std::move(old)) {}; 

oldからベースにストリームを移動するものです。

+0

あなたの答えはgcc 4.5で次のようなコンパイルエラーが発生します: "'std :: ios_base :: ios_base(const std :: ios_base&)'はプライベートです。あなたはこれをコンパイルしてもよろしいですか?もしそうなら、コンパイラは何ですか? – Clinton

+0

@Clinton:これまで何度もやったことがありますが、コードをコンパイルしようとはしませんでした。 ( "コンパイル"は必ずしも正しいC++であることをテストしているわけではありません)。試している新しいコードとすべてのエラーを含めるように質問を編集する必要があります。 – GManNickG

+0

ofstreamは確かにrvalueコンストラクタを持っていますか? – Clinton

0

ofstreamを返すことを呼び出し元が知っている必要がありますか、またはstreambufを返すことがより適切であり、発信者にストリーム内にそれを書き込ませるようにしますか?私はここで自分の質問に答えるつもりです

関連する問題