2012-05-25 15 views
6

Qual è la sintassi per un operatore di conversione mobile?Spostare la semantica per un operatore di conversione

Ho un involucro che avvolge obj, che ha un operatore obj conversione:

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

Come faccio a sapere se data_ dovrebbe essere copiato o spostato?

+1

Come si può spostare 'data_' in una' std :: string' in ogni caso? Se 'data_' fosse anche una' std :: string', questa domanda avrebbe molto più senso. – ildjarn

+1

@ildjarn la domanda riguarda la semantica di spostamento sull'operatore di conversione, non particolarmente su char * o std :: string. –

+0

Ok, questo ha più senso. Ti è appena capitato di scegliere il peggior tipo di dati possibile come primo esempio. ; -] – ildjarn

risposta

8

La sintassi per questo sarebbe qualcosa di simile:

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

La prima versione sarà chiamata quando la seconda versione non può essere chiamato (vale a dire: l'istanza wrap in fase di conversione non è un temporaneo o non c'è uso esplicito di std::move).

Si noti che Visual Studio non implementa questo aspetto dei riferimenti di valore r.

+0

'const &' potrebbe anche essere desiderabile in quanto le operazioni di copia di solito sono 'const'. –

+0

@Luc: buon punto. Fisso. –

+0

Penso che 'operator obj const &() const &' abbia più senso, se il valore di ritorno è un subobject. Non c'è bisogno di copiare. Allo stesso modo, l'operatore obj &&() && 'eliminerebbe una costruzione di spostamento, anche se dovrebbe essere O (1). – Potatoswatter

Problemi correlati