繁体   English   中英

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

[英]Why can't I emplace ifstreams in a vector?

在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作为其构造的参数来构造。”

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

c ++ 11中的流是可移动的,所以理论上你应该能够做你想要的,问题是gcc / libstdc ++中还没有实现可移动流。

要进一步补充我的答案,请查看gcc / libstdc ++ c ++ 11状态: http//gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011

特别是27.5,27.8,27.9

这是std::basic_istream实现中的一个错误。 它应该是可移动的,但不是; 并且只有可移动类型可以存储在向量中。

这是针对GCC的错误报告

由于它尚未修复(AFAIK),这里有一个快速的解决方法:

typedef std::shared_ptr<std::ifstream> SharedIFS;
inline SharedIFS MakeIFS(const std::string &file) {
    return SharedIFS(new std::ifstream(file));}

除非我错过了一些愚蠢的东西,否则SharedIFS应该是可移动的并且可以复制。 与普通的emplace_back相比,它有一些开销,但至少你可以把它放到一个向量中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM