具有std :: move函数签名的传递向量

问题描述 投票:3回答:2

考虑下面的代码

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)以使其能够采用向量的r值引用?

c++ move-semantics rvalue-reference
2个回答
0
投票

我的问题是,函数foo是否应该具有签名void foo(std::vector<int>&& v)以使其能够采用向量的r值引用?

如果这是您想要的,那么是的,但这并不意味着您拥有的是不正确的。当您将某些东西传递给函数时,复制会从源中初始化参数。也就是说,如果您这样做

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)是右值引用,因此为v选择了移动构造函数,并且v1被移入了函数。

因此,通过按值获取,您可以给调用者一个选项,使其成为临时对象,为它提供右值引用,这既会将对象移入函数中,也可以只是进行复制。如果您有void foo(std::vector<int>&& v),则只能传递一个临时值或std::move()一个左值。没有调用者自己制作的副本,然后将其移动到函数中的方法,将无法使调用者进行复制。


0
投票

通过将foo()称为foo(std::move(v1)),即v中的形式参数对象foo()

void foo(std::vector<int> v)

已移动构造。这是foo的移动构造函数,它需要一个std::vector<int>&&


0
投票

here所述,如果满足以下所有条件,则编译器将创建一个默认的移动运算符:

  • 没有用户声明的副本构造函数;
  • 没有用户声明的move构造函数;
  • 没有用户声明的副本分配运算符;
  • 没有用户声明的析构函数;
© www.soinside.com 2019 - 2024. All rights reserved.