2

私は次のものを持っています(単純化された問題):

class Stream()
{ 
    std::ofstream mStr;
public:
    Stream() : mStr("file", ofstream::out)
    {}

    Stream(const Stream & rhs) = delete;

    Stream(Stream && rhs) : mStr(move(rhs.mStr))
    {}

    void operator()(string& data)
    {
        mStr << data;
    }

    ~Stream() = default;
};

このオブジェクトはロギング目的 (データの測定) であり、短時間しか使用されないため、生きている限り開いています。主なアイデアは、次のように使用することです。

int main()
{
    std::function<void (std::string&)> Logger = Stream();
    for (std::string& data : DataList)
    {
        Logger(data);
    }
}

問題があります (GCC 4.7.2)。

  1. クラスにはStreamコピー コンストラクターが必要です。
  2. を動かせませんfstream

これはコンパイラの問題ですか、それともここで何か基本的なことが欠けていますか?

4

2 に答える 2

4

cppreference.com.functionによると:

template< class F > 
function( F f );

タイプFは でCopyConstructibleあり、オブジェクトfは である必要がありますCallable

しかし、Streamクラスのコピーコンストラクターは次のdeletedとおりです。

Stream(const Stream & rhs) = delete;

動けないfstream

これはlibstdc++ライブラリの既知の問題です。次のコードは、clang と で正常にコンパイルされますlibc++

std::fstream f1, f2;
f2 = std::move(f1);

しかし、で失敗しlibstdc++ます。

于 2013-06-04T07:06:48.603 に答える