为什么我不能将ifstream放入向量中?

时间:2013-06-13 14:23:59

标签: c++ c++11

以下示例程序也不能为我编译 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作为其构建的论据。“

有谁知道为什么这不编译呢?我误解了或者图书馆的实施尚未完成吗?

3 个答案:

答案 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实施中的一个错误。它应该是可移动的,但不是;并且只有可移动类型可以存储在矢量中。

Here is the bug report against GCC

答案 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相比,它有一些开销,但至少你可以将它放入一个向量中。