考虑下面的代码
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 构造函数 v
和v1
被移入函数中。
因此,通过按值获取,您可以为调用者提供一个选项,以给它一个临时值,给它一个右值引用,这都会将对象 move 到函数中,或者只是让复制发生。如果您有void foo(std::vector<int>&& v)
那你只能传一个临时的或者std::move()
左值。如果调用者自己不制作拷贝,然后将该拷贝 move 到函数中,则无法允许调用者制作拷贝。
关于c++ - 使用 std::move 函数签名传递 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59830685/