c++ - libreria - ¿Por qué no se puede mover std:: ostream?
iostream vs stdio (1)
Claramente, las transmisiones no se pueden copiar. Debería ser posible mover secuencias. De acuerdo con el párrafo 4 de la sección 27.9.1.11 [ofstream.cons], es posible mover la construcción std::ofstream
(lo mismo se std::*stringstream
variantes std::ifstream
, std::fstream
y std::*stringstream
). Por ejemplo:
#include <iostream>
#include <fstream>
#include <string>
std::ofstream makeStream(std::string const& name) {
return std::ofstream(name);
}
int main()
{
std::ofstream out{ makeStream("example.log") };
}
Intentar mover un std::ostream
, por ejemplo, para tener una función de fábrica creando un std::ofstream
, un std::ostringstream
u otro tipo de transmisión según un URN pasado como argumento no funciona. std::ostream
(bueno, la plantilla de clase std::basic_ostream
realidad) tiene un constructor de movimiento protected
acuerdo con 27.7.3.1 [ostream].
¿Por qué no puede std::ostream
moverse solo?
Originalmente eran móviles. Esto resultó ser un defecto de diseño por mi parte, y descubierto por Alberto Ganesh Barbati:
http://cplusplus.github.io/LWG/lwg-defects.html#911
El problema muestra algunos ejemplos donde ostream
se mueve y / o intercambia, y los resultados son sorprendentes, en lugar de esperados. Estaba convencido de que estos tipos no deberían ser públicamente movibles ni intercambiables por este problema.