C++ 流的std::是可移动的吗?

C++ 流的std::是可移动的吗?,c++,c++11,ofstream,C++,C++11,Ofstream,我有一张在MSVC10中编译得很好的地图: std::map<std::string, std::ofstream> m_logFiles; std::映射m_日志文件; 但是在启用了C++0x并使用g++4.5的ubuntu上,我收到以下错误消息: /usr/include/c++/4.5/bits/ios|u base.h | 785 |错误:“std::ios|u base::ios|u base(const std::ios|u base&)”是私有的 通过使用指针而不是

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

std::map<std::string, std::ofstream> m_logFiles;
std::映射m_日志文件;
但是在启用了C++0x并使用g++4.5的ubuntu上,我收到以下错误消息:

/usr/include/c++/4.5/bits/ios|u base.h | 785 |错误:“std::ios|u base::ios|u base(const std::ios|u base&)”是私有的

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

使用g++4.6.1没有帮助

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

在阅读库比的链接时,我尝试了以下方法:

#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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
地图m_日志文件;
流st;
m_logFiles.insert(make_pair(字符串(“a”)、move(st));
返回0;
}

但还是没有运气。g++抱怨使用了b删除副本构造函数。

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

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

int main()
{
    std::map<std::string, std::ofstream> m_logFiles;
}
#包括
#包括
#包括
int main()
{
映射m_日志文件;
}

参考27.9.1.11[ofstream.cons]。

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

任何一个编译器(甚至许多编译器)上的结果都不能真正回答这个问题。需要对规范的引用。@Nemo-Howard是为这个编译器实现标准库的人。我相信他。检查C++0x草案中几乎所有的第27节。我没有找到一个地方说“ofstream应该是可移动的”,但它指定流类有move构造函数和move赋值操作符,以及所有其他与move相关的管道。所以是的,它们是可移动的,正如霍华德所说的那样@博:谢谢你,博。Fwiw,我也是使osftream可移动的人。如果不是,我的心情会非常糟糕。:-)@尼莫:别开玩笑了,你说得很对。我添加了一个参考。发布的代码在GCC4.5.3中也可以编译。但是,GCC的库(与clang的libc++不同)尚未实现map.emplace()--也许这就是导致错误消息的原因?@Cubbi:我读了您的链接并尝试使用std::move,但没有更改。