Является ли std::ofstream подвижным?

У меня есть эта карта, которая прекрасно компилируется в MSVC10:

std::map<std::string, std::ofstream> m_logFiles;

Но в Ubuntu, использующем g++ 4.5 с включенным C++0x, я получаю следующее сообщение об ошибке:

/usr/include/c++/4.5/bits/ios_base.h|785|error: 'std::ios_base::ios_base(const std::ios_base&)' является приватным

Используя указатели вместо объектов, я решил проблему.
Выполняя поиск в Интернете, я узнал, что потоки не предназначены для копирования (причина была хорошо объяснена). Но мой вопрос, является ли std:: ofstream подвижным типом? Если это так, разве не должно быть разрешено его использование в качестве параметра шаблона в стандартных контейнерах?
Если да, то G ++ отстает от MSVC10 по этому вопросу? (что объясняет, почему это работает на MSVC). Я знаю, что было бы глупо просить авторов компиляторов полностью реализовать что-то, что даже не является окончательным, но мне любопытно относительно будущего.

Использование g ++ 4.6.1 не помогло.

Редактировать: читая комментарии, я вырыл немного дальше и обнаружил, что проблема связана с вставкой, а не с объявлением карты.

Читая ссылку Кубби, я попробовал следующее:

#include <string>
#include <fstream>
#include <map>

using namespace std;

int main()
{
    map<string, ofstream> m_logFiles;
    ofstream st;
    m_logFiles.insert(make_pair<string, ofstream>(string("a"), move(st)));
    return 0;
}

Но все равно не повезло. G ++ жалуется на использование конструктора удаленных копий.

2 ответа

Решение

std::ofstream подвижный Эта программа компилируется для меня, используя clang/libC++:

#include <string>
#include <fstream>
#include <map>

int main()
{
    std::map<std::string, std::ofstream> m_logFiles;
}

Ссылка 27.9.1.11 [ofstream.cons].

Я задал похожий вопрос ранее, а позже обнаружил, что GCC пока не поддерживает подвижные потоки (я только что протестировал GCC 4.6.1), как подробно описано в этом ответе.

Другие вопросы по тегам