seekp ofstring ejemplo c++ c++11 gcc clang fstream

c++ - ofstring - ¿Por qué no puedo mover std:: ofstream?



ofstream<< (1)

Mirando las respuestas anteriores en SO, parece que mientras std::ostream no es móvil, std::ofstream debería ser. Sin embargo, este código

#include <fstream> int main() { std::ofstream ofs; std::ofstream ofs2{std::move(ofs)}; }

no parece compilar en ninguna versión de gcc o clang que probé (con --std = c ++ 11 o --std = c ++ 14). El error del compilador varía un poco, pero esto es lo que obtengo para gcc 4.9.0

6 : error: use of deleted function ''std::basic_ofstream::basic_ofstream(const std::basic_ofstream&)''

¿Es este el comportamiento esperado, según el estándar?

Tenga en cuenta que antes se hizo una pregunta muy similar ( ¿es std :: ofstream movible? ) Pero parece que el estándar ha cambiado desde entonces (como se detalla en ¿Por qué no se puede mover std :: ostream? ) Haciendo que las respuestas estén desactualizadas. Ciertamente, ninguna de esas respuestas explica por qué el código anterior no se compila.

Encontré este problema al tratar de usar contenedores de ofstream , que no funciona debido a lo anterior.


Según la norma.

27.9.1.11 constructores basic_ofstream

o, su versión más "legible" http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream , std::basic_ostream<> tiene un constructor de movimiento, por lo que el código debe compilarse.

clang ++ 3.5 lo compila con -std=c++11 o -std=c++1y . También gcc5 lo compila, así que probablemente no esté implementado en libstdc ++ para gcc <5

Curiosamente, la falta de semántica de movimientos no se menciona en la implementación de gcc stdlibc ++ https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014

Consulte https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316 para obtener un informe de errores, gracias a @BoBTFish por señalarlo. Se confirma que el problema se solucionó en gcc5.