2013-06-04 52 views
2

我已经得到了下面的(简化的问题):C++ 11 - 移动对象包含FILESTREAM

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

按照cppreference.com.function

template< class F > 
function(F f); 

类型FCopyConstructible和对象fCallable

但你的拷贝构造函数Streamdeleted

Stream(const Stream & rhs) = delete; 

我不能移动fstream

这是一个已知的问题libstdc++库。下面的代码编译罚款铛和libc++

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

但失败libstdc++

0

你可以使用lambda功能的解决方法:

Stream s; 
auto Logger = [&s] (std::string& data) { 
    s(data); 
}; 

for (std::string& data : DataList) { 
    Logger(data); 
}