10

我有这张在 MSVC10 中编译得很好的地图:

std::map<std::string, std::ofstream> m_logFiles;

但是在使用启用了 C++0x 的 g++ 4.5 的 ubuntu 上,我收到以下错误消息:

/usr/include/c++/4.5/bits/ios_base.h|785|error: 'std::ios_base::ios_base(const std::ios_base&)' 是私有的

通过使用指针而不是对象,我解决了这个问题。
在网上搜索,我了解到流并不意味着被复制(原因解释得很好)。但我的问题是,std::ofstream 是可移动类型吗?如果是,它不应该允许它在标准容器中用作模板参数吗?
如果是,那么在这一点上 g++ 是否落后于 MSVC10?(这将解释为什么它适用于 MSVC)。我知道要求编译器编写者完全实现甚至不是最终的东西是愚蠢的,但我对未来很好奇。

使用 g++ 4.6.1 没有帮助。

编辑:阅读我进一步挖掘的评论,发现插入导致问题,而不是地图的声明。

阅读 Cubbi 的链接,我尝试了以下方法:

#include <string>
#include <fstream>
#include <map>

using namespace std;

int main()
{
    map<string, ofstream> m_logFiles;
    ofstream st;
    m_logFiles.insert(make_pair<string, ofstream>(string("a"), move(st)));
    return 0;
}

但仍然没有运气。g++ 抱怨使用 b 已删除的复制构造函数。

4

2 回答 2

8

std::ofstream是可移动的。该程序使用 clang/libc++ 为我编译:

#include <string>
#include <fstream>
#include <map>

int main()
{
    std::map<std::string, std::ofstream> m_logFiles;
}

参考 27.9.1.11 [ofstream.cons]。

于 2011-08-15T15:21:32.683 回答
6

我之前问了一个类似的问题,后来发现 GCC 似乎还不支持可移动的 fstream(我刚刚测试了 GCC 4.6.1),如this answer中所述。

于 2011-08-17T01:40:43.790 回答