英文:
Will there be a move here
问题
这里是简化后的代码片段:
void printArray(vector<int> arr)
{
vector<int> temp_a = arr; // <<------- 移动到这里?
for (int i = 0; i < temp_a.size(); ++i)
cout << temp_a[i] << endl;
}
那里会发生移动吗?
英文:
Here is simplified code snippet:
void printArray(vector<int> arr)
{
vector<int> temp_a = arr; //<<------- move here?
for(int i = 0; i < temp_a.size(); ++i)
cout << temp_a[i] << endl;
}
Will there be a move there?
答案1
得分: 2
不,std::vector
的移动构造函数不会在那种情况下被使用;相反,将使用复制构造函数。
一般来说,移动不会隐式发生,因为由标识符(未限定标识符)构成的每个表达式都是左值(例如,arr
是左值)。移动构造函数接受 std::vector&&
的右值引用,而它不能绑定到左值。因此,会调用复制构造函数。
唯一的例外是在返回语句中:
// 如果 arr 是局部变量,它将在此隐式移动
return arr;
要在您的情况下移动向量,您必须使用 std::move
:
vector<int> temp_a = move(arr);
然而,在这种情况下,整个函数也可以简化为:
void printArray(const vector<int>& arr)
{
for(int x : arr)
cout << x << '\n';
}
英文:
No, the move constructor of std::vector
won't be used in that instance; the copy constructor will be used instead.
In general, moves don't happen implicitly, because every expression made of an identifier (unqualified-id) is an lvalue (e.g. arr
is an lvalue). The move constructor accepts a std::vector&&
rvalue reference, and that cannot bind to lvalues. As a result, the copy constructor is called.
The only exception to this rule is in a return statement:
// if arr is a local variable, it will be moved implicitly here
return arr;
To move the vector in your case, you must use std::move
:
vector<int> temp_a = move(arr);
However, the whole function could also be simplified to:
void printArray(const vector<int>& arr)
{
for(int x : arr)
cout << x << '\n';
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论