2011-12-15 11 views
9

Devo davvero incapsulare la chiamata std :: move in un lambda?Sta mettendo in pratica std :: move inside a lambda?

std::list<std::wstring>  srcData = GetData(); // implementation not important 
std::vector<std::wstring> dstData; 
dstData.reserve(srcData.size()); 
std::transform(std::begin(srcData), std::end(srcData), std::back_inserter(dstData), 
    [](std::wstring& guid) -> std::wstring { return std::move(guid); }); 
srcData.clear(); 

Sono ancora nuovo per lambda e riferimenti rvalue, quindi inizialmente ho provato:

std::transform(std::begin(srcData), std::end(srcData), 
    std::back_inserter(dstData), &std::move<std::wstring>); 

che non funziona.

Devo mettere la mossa all'interno di una lambda o mi manca qualcosa di ovvio?

+1

Che cosa sei stai cercando di ottenere? In questo caso non è sufficiente usare semplicemente std :: copy o std :: vector dstData (srcData.begin(), srcData.end())? – kyku

+0

Secondo. Inoltre, ciò che si è tentato di fare in parte, senza la lambda sta prendendo l'indirizzo del valore di ritorno di std :: mossa, che si comporta esattamente come un temporaneo. Prendere l'indirizzo di un temporaneo è sempre una cattiva idea. – Bob

+3

@kyku Il punto è ovviamente quello di evitare di * * copiare le stringhe, invece spostando le corde. A seconda di come viene implementato std :: string, questo potrebbe avere un grande vantaggio in termini di prestazioni. – wolfgang

risposta

12

Un'alternativa è quella di usare iteratori Move:

std::vector<std::wstring> dstData(std::make_move_iterator(srcData.begin()), 
            std::make_move_iterator(srcData.end())); 

Oppure utilizzare il move algoritmo:

std::move(srcData.begin(), srcData.end(), std::back_inserter(dstData)); 

Da quando è stato chiesto, ecco come si potrebbe forzare la proposta originaria di lavorare :

int main() 
{ 
    std::transform(std::begin(srcData), 
     std::end(srcData), 
     std::back_inserter(dstData), 
     static_cast<std::wstring&&(*)(std::wstring&)>(&std::move<std::wstring&>)); 
} 
+0

Maledico, pubblicando esattamente ciò che volevo quando ho scoperto questa domanda! : P – Xeo

+0

@Xeo: vivo per 'muovere' ... –

+1

Buona risposta +1. Ma mi piacerebbe ancora sapere perché passando 'std :: mossa ' come il quarto parametro non ha funzionato, sembra come dovrebbe. –

Problemi correlati