簡體   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