在lambda中放入std::move真的有必要吗?

Is putting std::move inside a lambda really necessary here?

本文关键字:真的 move std lambda      更新时间:2023-10-16

我真的必须在lambda中封装std::move调用吗?

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内,还是我错过了一些明显的东西?

另一种方法是使用move迭代器:

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&>));
}