Почему я не могу переместить 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.

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