2012-05-25 15 views
6

¿Cuál es la sintaxis para un operador de conversión móvil?Semántica de movimiento para un operador de conversión

que tienen un envoltorio que envuelve obj, que tiene un operador de conversión obj:

class wrap { 
public: 
    operator obj() { ... } 
private: 
    obj data_; 
}; 

¿Cómo puedo averiguar si data_ debe copiar o mover?

+1

¿Cómo podría mover 'data_' en un' std :: string' de todos modos? Si 'data_' fuera un' std :: string' también, esta pregunta tendría mucho más sentido. – ildjarn

+1

@ildjarn la pregunta es acerca de la semántica de movimiento en el operador de conversión, no particularmente sobre char * o std :: string. –

+0

Bien, eso tiene más sentido. Acabas de elegir el peor tipo de datos posible como tu primer ejemplo. ; -] – ildjarn

Respuesta

8

La sintaxis para que sería algo como esto:

class wrap { 
public: 
    operator obj() const & { ... } //Copy from me. 
    operator obj() && { ... } //Move from me. 
private: 
    obj data_; 
}; 

La primera versión se llamará cuando la segunda versión no puede ser llamado (es decir: la instancia wrap siendo convertido no es una temporal o no hay uso explícito de std::move).

Tenga en cuenta que Visual Studio no implementa este aspecto de las referencias de valores r.

+0

'const &' podría ser incluso deseable ya que las operaciones de copia usualmente son 'const'. –

+0

@Luc: Buen punto. Fijo. –

+0

Creo que 'operator obj const &() const &' tiene más sentido, si el valor de retorno es un subobjeto. No hay necesidad de copiar. Del mismo modo 'operador obj &&() &&' eliminaría una construcción de movimiento, incluso si se espera que sea O (1). – Potatoswatter

Cuestiones relacionadas