2011-12-15 61 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&>)); 
}