微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

传递给函数时使用 std::vector 误解移动语义

如何解决传递给函数时使用 std::vector 误解移动语义

我尝试理解移动语义的概念并做了一些测试。我有以下功能

// testing the move semantic when passing 
// argument to be modified without copying

void process_copy( std::vector<int>&& aVec)
{
    std::cout << "Move semantic\n";
    aVec.push_back(42);
}

现在在主函数中,如下:

int main()
{
    std::vector<int> w_vec = {1,2,3,4,5};
    process_copy( std::move(w_vec));
}

我希望 w_vec 现在是空的,因为我通过移动转换(将左值转换为右值)传递了它。但结果是 w_vec 现在包含 6 个元素(42添加到向量中)。

我想念的东西? std::vector 是可移动的物体吗?

解决方法

我的 CoreCpp 2019 T 恤的图片可能与此处相关。

CoreCpp 2019 t-shirt ?

这是前面。

t-shirt front ?

有趣的是,std::move 的这种行为有点令人惊讶,even for Howard Hinnant himself 是右值和移动语义背后的人。不过他得到了非常彻底的答复there

,

您可能缺少的是,您只是将右值引用绑定到您传递的向量;您根本没有移动任何矢量对象。

import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" # see issue #152 os.environ["CUDA_VISIBLE_DEVICES"]="3" 参数的类型为 process_copy(),即对 std::vector<int>&& 的右值引用:

std::vetor<int>

在调用 void process_copy(std::vector<int>&& aVec) 时使用 std::move(),如下所示:

process_copy()

您只是使将此引用(即 process_copy(std::move(w_vec)); 的参数 process_copy())绑定到参数(即向量 aVec)成为可能。也就是说,以下内容无法编译:

w_vec

因为您无法将右值引用 (process_copy(w_vec); ) 绑定到 左值 (aVec)。


如果您希望在调用 w_vec 时移动向量参数 w_vec,那么您可以让函数采用 process_copy() by value 而不是move在调用函数的时候构造这个参数:

std::vector<int>

通过在调用此 void process_copy(std::vector<int> aVec) // <-- not a reference { aVec.push_back(42); } 时用 std::move() 标记向量参数,参数 process_copy() 将被移动构造 - 因此向量参数将最终处于移动状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。