Почему я не могу переместить std::ofstream?
Глядя на предыдущие ответы на SO, кажется, что пока std::ostream
не может быть подвижным, std::ofstream
должно быть. Тем не менее, этот код
#include <fstream>
int main()
{
std::ofstream ofs;
std::ofstream ofs2{std::move(ofs)};
}
похоже не компилируется ни в одной из версий gcc или clang, которые я пробовал (с --std= C++11 или --std= C++14). Ошибка компилятора несколько отличается, но вот что я получаю для gcc 4.9.0
6 : error: use of deleted function 'std::basic_ofstream::basic_ofstream(const std::basic_ofstream&)'
Это ожидаемое поведение в соответствии со стандартом?
Обратите внимание, что ранее был задан очень похожий вопрос ( является ли std::ofstream подвижным?), Но с тех пор стандарт изменился (как подробно описано в разделе Почему нельзя перемещать std::ostream?), Что делает эти ответы устаревшими. Конечно, ни один из этих ответов не объясняет, почему приведенный выше код не компилируется.
Наткнулся на эту проблему при попытке использовать контейнеры ofstream
, который не работает из-за вышеизложенного.
1 ответ
В соответствии со стандартом
27.9.1.11 basic_ofstream конструкторы
или его более "читаемая" версия http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream, std::basic_ostream<>
имеет конструктор перемещения, поэтому код должен компилироваться.
clang ++ 3.5 компилирует его -std=c++11
или же -std=c++1y
, Также gcc5 компилирует его, поэтому, вероятно, он не реализован в libstdC++ для gcc < 5
Интересно отметить, что отсутствие семантики перемещения не упоминается при реализации gcc на stdlibC++ https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html
См. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316 для сообщения об ошибке, спасибо @BoBTFish за указание. Подтверждено, что проблема была исправлена в gcc5.