以下示例程序也不能为我编译 clang 3.1或gcc 4.8:
#include <fstream>
#include <vector>
using namespace std;
int main()
{
vector<ifstream> bla;
bla.emplace_back("filename");
return 0;
}
然而,我认为emplace_back应该
“在向量的末尾插入一个新元素 当前最后一个元素这个新元素是使用构建的 args作为其构建的论据。“
有谁知道为什么这不编译呢?我误解了或者图书馆的实施尚未完成吗?
答案 0 :(得分:15)
c ++ 11中的Streams是可移动的,所以理论上你应该能够做你想要的,问题是gcc / libstdc ++中还没有实现可移动的流。
要进一步备份我的答案,请查看gcc / libstdc ++ c ++ 11状态: http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011
特别是27.5,27.8,27.9
答案 1 :(得分:7)
这是std::basic_istream
实施中的一个错误。它应该是可移动的,但不是;并且只有可移动类型可以存储在矢量中。
答案 2 :(得分:0)
由于它还没有修复(AFAIK),这里有一个快速的解决方法:
typedef std::shared_ptr<std::ifstream> SharedIFS;
inline SharedIFS MakeIFS(const std::string &file) {
return SharedIFS(new std::ifstream(file));}
除非我错过了一些愚蠢的东西,否则SharedIFS应该是可移动的并且可以复制。与普通的emplace_back相比,它有一些开销,但至少你可以将它放入一个向量中。