Почему я не могу помещать ifstreams в вектор? - программирование
Подтвердить что ты не робот

Почему я не могу помещать ifstreams в вектор?

Следующая примерная программа не компилируется для меня ни на 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 как аргументы для его построения.

Кто-нибудь знает, почему это не компилируется? я неправильно понял или не реализует реализацию библиотеки?

4b9b3361

Ответ 1

Потоки в С++ 11 являются подвижными, поэтому теоретически вы должны иметь возможность делать то, что хотите, проблема в том, что подвижные потоки еще не реализованы в gcc/libstdС++.

Чтобы выполнить резервное копирование моего ответа, пожалуйста, посмотрите gcc/libstdС++ С++ 11 status: http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011

Особенно 27,5, 27,8, 27,9

Ответ 2

Это ошибка в реализации std::basic_istream. Он должен быть подвижным, но не является; и только переносные типы могут быть сохранены в векторе.

Вот отчет об ошибке с GCC.

Ответ 3

Так как он еще не исправлен (AFAIK), здесь быстрый способ:

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

Если я не пропустил что-то глупое, SharedIFS должен быть подвижным и скопированным просто отлично. Он имеет некоторые накладные расходы по сравнению с простым emplace_back, но по крайней мере вы можете поместить его в вектор.