【发布时间】:2011-12-15 12:46:47
【问题描述】:
我真的必须将 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();
我对 lambdas 和右值引用还是新手,所以最初我尝试过:
std::transform(std::begin(srcData), std::end(srcData),
std::back_inserter(dstData), &std::move<std::wstring>);
这不起作用。
我是否必须将移动放在 lambda 中,还是我遗漏了一些明显的东西?
【问题讨论】:
-
你想达到什么目的?在这种情况下,仅使用 std::copy 或 std::vector<:wstring> dstData(srcData.begin(), srcData.end()) 还不够吗?
-
第二个。此外,您在没有 lambda 的部分中尝试执行的操作是获取 std::move 的返回值的地址,这与临时的完全一样。获取临时地址总是一个坏主意。
-
@kyku 重点显然是避免复制字符串,而不是移动字符串。根据 std::string 的实现方式,这可能具有很大的性能优势。
-
@Bob 不,这里没有调用 std::move,它的地址正在被占用。这应该是一个函数指针,而不是一个临时地址。