我真的必须将 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 中,或者我是否遗漏了一些明显的东西?
最佳答案
另一种方法是使用移动迭代器:
std::vector<std::wstring> dstData(std::make_move_iterator(srcData.begin()),
std::make_move_iterator(srcData.end()));
或者使用移动
算法:
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&>));
}
关于c++ - 在这里真的有必要将 std::move 放在 lambda 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8520758/