¿Son std :: streams ya móviles?
Pregunta
GNU gcc 4.3 admite parcialmente el próximo estándar c ++ 0x: entre las características implementadas, la referencia rvalue. Mediante la referencia rvalue debería ser posible mover un objeto no copiable o devolverlo desde una función.
¿Los std :: streams ya se pueden mover por medio de la referencia rvalue o la implementación de la biblioteca actual carece de algo?
Solución
En el g ++ svn actual, el soporte de referencia rvalue aún no se ha agregado a las transmisiones. Sospecho que agregarlo no será demasiado difícil y, como siempre con el software de código abierto, los parches son, estoy seguro, ¡bienvenidos!
Otros consejos
Después de una investigación rápida, resulta que el soporte de rvalue reference aún no se ha agregado a las transmisiones.
Para devolver un objeto no copiable desde una función, de hecho es suficiente implementar el mover constructor de la siguiente manera:
struct noncopyable
{
noncopyable()
{}
// move constructor
noncopyable(noncopyable &&)
{}
private:
noncopyable(const noncopyable &);
noncopyable &operator=(const noncopyable &);
};
Se supone que dicho constructor transfiere la propiedad al nuevo objeto dejando el que se pasa en un estado predeterminado.
Dicho esto, es posible devolver un objeto de una función de esta manera:
noncopyable factory()
{
noncopyable abc;
return std::move(abc);
}
Si bien std :: stream no admite constructores de movimiento, parece que los contenedores STL enviados con gcc 4.3.2 ya lo admiten.