std::move 不处理 RValue 引用函数
std::move Not Working on RValue Reference Function
在尝试学习 std::move 和右值引用时,我遇到了以下问题:
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,但这里它仅作为参考移动。谁能解释一下这里发生了什么。
您对 move 的假设是错误的:
std::move is used to indicate that an object t may be "moved from",
i.e. allowing the efficient transfer of resources from t to another
object.
In particular, std::move produces an xvalue expression that identifies
its argument t. It is exactly equivalent to a static_cast to an
rvalue reference type.
这并不意味着向量的大小应该在您的代码中变为零。
std::move
仅转换为右值引用。
foo
将 Rvalue ref 设为 vector<int>
。通过 move(vecNumbers)
你得到 vector<int>&&
。在 foo
中,您只需访问在 main
中定义的 vecNumbers
。您没有执行任何更改此向量内容的操作。
如果你真的想移动(窃取)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>
的移动构造函数,将 vecNumbers
移动到 foo
.
中的 value
在尝试学习 std::move 和右值引用时,我遇到了以下问题:
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,但这里它仅作为参考移动。谁能解释一下这里发生了什么。
您对 move 的假设是错误的:
std::move is used to indicate that an object t may be "moved from", i.e. allowing the efficient transfer of resources from t to another object.
In particular, std::move produces an xvalue expression that identifies its argument t. It is exactly equivalent to a static_cast to an rvalue reference type.
这并不意味着向量的大小应该在您的代码中变为零。
std::move
仅转换为右值引用。
foo
将 Rvalue ref 设为 vector<int>
。通过 move(vecNumbers)
你得到 vector<int>&&
。在 foo
中,您只需访问在 main
中定义的 vecNumbers
。您没有执行任何更改此向量内容的操作。
如果你真的想移动(窃取)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>
的移动构造函数,将 vecNumbers
移动到 foo
.
value