c++ - 使用 std::move 函数签名传递 vector

标签 c++ move-semantics rvalue-reference

考虑下面的代码

void foo(std::vector<int> v)
{
   //do something here
}
//calling the function
vector<int> v1 = {1,2,3};
foo(std::move(v1));

我的问题是,函数 foo 不应该有签名 void foo(std::vector<int>&& v)它能够获取 vector 的 r 值引用吗?

最佳答案

My question is, isnt the function foo supposed to have signature void foo(std::vector<int>&& v) for it to be able to take the r value reference of the vector?

如果这就是您想要的,那么可以,但这并不意味着您所拥有的不正确。当您将某些内容传递给函数时,它会从源复制初始化参数。这意味着如果你这样做

vector<int> v1 = {1,2,3};
foo(v1);

然后foo获取 v1 的拷贝。与

vector<int> v1 = {1,2,3};
foo(std::move(v1));

我们复制初始化v来自std::move(v1)std::move(v1)以来是右值引用,则选择 move 构造函数 vv1被移入函数中。

因此,通过按值获取,您可以为调用者提供一个选项,以给它一个临时值,给它一个右值引用,这都会将对象 move 到函数中,或者只是让复制发生。如果您有void foo(std::vector<int>&& v)那你只能传一个临时的或者std::move()左值。如果调用者自己不制作拷贝,然后将该拷贝 move 到函数中,则无法允许调用者制作拷贝。

关于c++ - 使用 std::move 函数签名传递 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59830685/

相关文章:

c++ - 使用 cmake 将 obj 文件添加到链接器输入

c++ - Sprite Kit 继续调用第一个 If 语句

c++ - 我们如何确保传递的 2 个参数被视为第一个和第三个,而第二个和第四个被视为默认值

c++ - 我应该如何正确地将 packaged_task move 到 lambda?

c++ - 使用 std::move,调用 move 构造函数但对象仍然有效

c++ - 在 VS 2013 中使用初始化列表初始化 map 的 map

C++ 模板函数中的左值和右值

c++ - 多个构造函数参数的 move 语义

c++ - "rvalue references for *this"有什么用?

c++ - 具有类型推导的构造函数中的通用引用