c++ c++11 move-semantics rvalue-reference

c++ - Soluciones provisionales para ninguna referencia ''rvalue a*esta'' característica



c++11 move-semantics (1)

Buena pregunta. Intenté escribir un tipo similar de clase proxy recientemente pero nunca logré una buena solución. Lo mejor que encontré fue llamar a una función de miembro en cada uso donde se requería que el proxy fuera un valor r:

ORef<T> move() { return ORef<T>( this->release() ); }

Esto cambia la semántica de declarar algo un valor r de std::move(proxy) a proxy.move() , pero también permite la posibilidad de devolver un objeto de un tipo diferente (implícitamente convertible al tipo requerido).

Mi práctica de codificación al usar esto era pasar siempre los objetos proxy como valores que forzaban la especificación manual de la semántica (movimiento, referencia compartida, copia o lo que sea), pero eso por supuesto hace que los errores de uso sean un problema potencial (por ejemplo, llamar a x.move() antes el uso final de x ).

Tengo una clase de contenedor de proxy alrededor de un objeto móvil, y deseo que el proxy pueda generar implícitamente una referencia de valor real al objeto subyacente, pero solo cuando se mueve el proxy.

Creo que podré implementar este comportamiento según la propuesta n2439 "Extender la semántica de movimientos a * esto" , pero todavía no está disponible en un lanzamiento de gcc y no lo será por un tiempo.

El código que aparece a continuación es el objetivo final, pero actualmente no es posible. Hasta que esta característica esté disponible para mí, ¿hay soluciones alternativas equivalentes?

template< class T > struct movable_proxy { operator T&&() && { return std::move(value); } operator const T&() const& { return value; } private: T value; };