gpt4 book ai didi

c++ - std::move 不适用于 RValue 引用函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:34 25 4
gpt4 key购买 nike

在尝试学习 std::move 和 rvalue reference 时,我遇到了以下问题:

int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> vecNumbers;
vecNumbers.push_back(10);
vecNumbers.push_back(20);

foo(std::move(vecNumbers));

std::cout<<"After Move \n";
std::cout<<"size:"<<vecNumbers.size()<<"\n";

return 0;
}

void foo( std::vector<int> &&value)
{
std::cout<<"size in Function:"<<value.size()<<"\n";
}

输出

size in Function:2
After Move
size:2

vector 上调用 move 后,我预计大小为 0,但这里它仅作为引用移动。有人可以解释一下这里发生了什么。

最佳答案

std::move仅转换为右值引用。

foo将 Rvalue ref 设为 vector<int> .通过 move(vecNumbers)你得到 vector<int>&& .里面foo您只需访问 vecNumbersmain 中定义.您没有执行任何更改此 vector 内容的操作。

如果你真的想移动(窃取)vecNumbers 的内容您必须调用移动构造函数或移动赋值运算符。里面foo你可以这样做:

void foo(  std::vector<int>&& value)
{
std::vector<int> v1{std::move(value)}; // invoke move ctor which steals content of value
std::cout<<"size in Function:"<<value.size()<<"\n";
}

或者您可以将 foo 的签名更改为:

void foo(std::vector<int> value) {

}

然后当你调用

foo(std::move(vecNumbers))

移动 vector<T> 的构造函数被称为移动vecNumbersvalue里面foo .

关于c++ - std::move 不适用于 RValue 引用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57968204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com