[英]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
实现中的一个错误。 它应该是可移动的,但不是; 并且只有可移动类型可以存储在向量中。
由于它尚未修复(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.