2011-12-15 13 views
9

Czy naprawdę muszę hermetyzować wywołanie std :: move w lambda?Czy umieszczenie std :: wewnątrz lambda jest naprawdę potrzebne?

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(); 

wciąż jestem nowy na lambdas i odniesień rvalue, więc początkowo próbowałem:

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

który nie działa.

Czy muszę umieścić ruch wewnątrz lambda, czy też brakuje mi czegoś oczywistego?

+1

Co ty r próbuje osiągnąć? W tym przypadku nie wystarczy użyć std :: copy lub std :: vector dstData (srcData.begin(), srcData.end())? – kyku

+0

2. to. Dodatkowo, co próbujesz zrobić w części bez lambda, przyjmuje adres zwracanej wartości std :: move, która działa dokładnie tak, jak tymczasowy. Podanie adresu tymczasowego jest zawsze złym pomysłem. – Bob

+3

@kyku Punktem jest oczywiście * unikanie * kopiowania ciągów, zamiast przesuwania ciągów. W zależności od tego, w jaki sposób implementowany jest ciąg std :: string, może to mieć dużą zaletę. – wolfgang

Odpowiedz

12

Alternatywą jest użycie iteratorów ruch:

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

Albo użyć algorytmu move:

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

Ponieważ poproszono, oto jak można zmusić oryginalną propozycję pracy :

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

Przeklęcie, po prostu publikuj dokładnie to, co chciałem, gdy odkryłem to pytanie! : P – Xeo

+0

@Xeo: Żyję, aby "przenieść" ... –

+1

Dobra odpowiedź +1. Ale nadal chciałbym wiedzieć, dlaczego przekazanie 'std :: move ' jako czwarty parametr nie działa, wygląda na to, że powinien. –

Powiązane problemy