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.