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.