C++ 为什么可以';我不能在向量中放置ifstreams吗?

C++ 为什么可以';我不能在向量中放置ifstreams吗?,c++,c++11,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; } #包括 #包括 使用名称空间std; int main() { 载体bla; bla.empla

下面的示例程序也没有为我编译 clang 3.1或gcc 4.8:

#include <fstream>
#include <vector>

using namespace std;

int main()
{
    vector<ifstream> bla;
    bla.emplace_back("filename");
    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
载体bla;
bla.emplace_back(“文件名”);
返回0;
}
然而,我认为你应该回去

在向量的末尾插入新元素,就在它的后面 当前最后一个元素。此新元素使用 args作为其构造的参数。”


有人知道为什么它不能编译吗?我是否误解了,或者库的实现还没有完成?

c++11中的流是可移动的,所以从理论上讲,您应该能够做您想做的事情,问题是,可移动流还没有在gcc/libstdc++中实现

要进一步支持我的回答,请查看gcc/libstdc++c++11状态:


尤其是27.5、27.8、27.9,这是
std::basic_istream
实现中的一个bug。它应该是可移动的,但不是;矢量中只能存储可移动的类型

.

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

typedef std::shared_ptr<std::ifstream> SharedIFS;
inline SharedIFS MakeIFS(const std::string &file) {
    return SharedIFS(new std::ifstream(file));}
typedef std::shared_ptr SharedIFS;
内联SharedIFS MakeIFS(const std::string和file){
返回SharedIFS(新std::ifstream(文件));}

除非我错过了一些愚蠢的东西,否则ShareDif应该是可移动和可复制的。它比普通的EntPrimeBuffe有一些开销,但至少你可以把它放进向量中。

我不知道C++,但是你是否通过你的JuiTee包含了矢量中的一个键入。你是说向量吗?如果我弄错了,请纠正我。
std::vector
的元素必须是可复制的,fstream是不可复制的。
ifstream
是在
fstream
include中定义的有效类型。我尝试将
emplace_back()
更改为
push_back(std::move(foo))
,GCC 4.7.3给了我一个内部编译器错误并崩溃。是的,这提到在某些版本的gcc中,移动和交换操作并没有针对流类实现。也许您的版本缺少支持?谢谢,这就解释了。您是否也可以将可复制类型存储在向量中,即使它们不可移动?@dgel:streams也不可复制(在C++98或C++11中都不可复制)。@HighCommander4:我知道,但我是在评论他关于“只有可移动类型才能存储在向量中”的一般性陈述,这可能会让人困惑。@dgel:copyable类型是可移动的。“可移动”意味着您可以创建与现有对象相同的对象(可能使现有对象无效);“可复制”意味着您可以在不更改现有对象的情况下执行该操作。@迈克·西摩:谢谢,我认为movable意味着它实现了移动语义,而可复制类型可能无法实现相关的移动相关功能。