2011-12-15 14 views
9

¿Realmente tengo que encapsular la llamada std :: move en una lambda?¿Es realmente necesario poner el std :: move dentro de un 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(); 

todavía soy nuevo en lambdas y referencias rvalue, por lo que inicialmente Traté:

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

que no funciona.

¿Debo poner el movimiento dentro de una lambda, o me falta algo obvio?

+1

¿Qué es usted? Estoy tratando de lograr? En este caso, ¿no es suficiente usar std :: copy o std :: vector dstData (srcData.begin(), srcData.end())? – kyku

+0

2do eso. Además, lo que intentó hacer en la parte sin la lambda es tomar la dirección del valor de retorno de std :: move, que actúa exactamente como un temporal. Tomar la dirección de un temporal siempre es una mala idea. – Bob

+3

@kyku El objetivo es, obviamente, * evitar * copiar las cadenas, en lugar de mover las cadenas. Dependiendo de cómo se implemente std :: string, esto puede tener una gran ventaja de rendimiento. – wolfgang

Respuesta

12

Una alternativa es el uso de iteradores movimiento:

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

O utilizar el algoritmo de move:

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

Desde que se pidió, aquí es cómo se puede obligar a la propuesta original para trabajar :

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

¡Te maldigo, publicando exactamente lo que quería cuando descubrí esta pregunta! : P – Xeo

+0

@Xeo: vivo para 'mover' ... –

+1

Buena respuesta +1. Pero aún me gustaría saber por qué pasar 'std :: move ' como el cuarto parámetro no funcionó, parece que debería. –

Cuestiones relacionadas