15

以下示例程序无法在 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 作为其构造的参数就地构造的。”

有谁知道为什么这不编译呢?我误解了还是库实现尚未完成?

4

3 回答 3

15

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

于 2013-06-13T14:40:21.403 回答
7

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

这是针对 GCC 的错误报告

于 2013-06-13T14:41:03.737 回答
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 相比,它有一些开销,但至少您可以将其放入向量中。

于 2014-09-20T15:44:49.533 回答