2011-12-15 57 views
9

我真的必須在lambda中封裝std :: move調用嗎?把std :: move裏面的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(); 

我還是新的lambda表達式和右值引用,所以最初我想:

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

不工作。

我是否必須將這一舉動放在lambda表達式中,還是缺少明顯的東西?

+1

你在做什麼試圖實現?在這種情況下,僅僅使用std :: copy或std :: vector dstData(srcData.begin(),srcData.end())是不夠的? – kyku 2011-12-15 13:28:35

+0

第二。另外,你在沒有使用lambda的地方嘗試做的事情就是獲取std :: move的返回值的地址,它的作用就像是臨時的。採取臨時地址總是一個壞主意。 – Bob 2011-12-15 13:31:41

回答

12

另一種方法是使用移動迭代器:

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

或者使用move算法:

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

既然有人問,這裏是你怎麼可能會迫使原提案工作:

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