c++ - 在这里真的有必要将 std::move 放在 lambda 中吗?

标签 c++ c++11

我真的必须将 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/

相关文章:

c++ - #if 已定义 WINDOWS 与 #if 已定义(WINDOWS)

.net - C++/CLI 中的垃圾收集

c++ - 在 C++ 中创建双向链表

c++11 具有 avr __progmem__ 的广义属性

c++ - 是否可以根据分配对象的类型特征覆盖全局 new 运算符?

c++ - Eclipse 索引器显示误报语义错误

c++ - 在应用程序运行时编译.dll

c++ - 错误 : ‘fuse_operations_compat2’ has no non-static data member named ‘readdir’

c++ - 可变参数模板

c++ - 从 'A&'类型的右值无效初始化 'A'类型的非const引用