gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:24:48 24 4
gpt4 key购买 nike

考虑下面的代码

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com