【发布时间】:2021-08-12 13:19:35
【问题描述】:
您好,我想了解如何使用带有右值和左值引用作为参数的函数的重载版本。所以这是我写的例子,以更好地理解差异:
car.h
class Car{
private:
int number=1000;
string name="default name";
std::set<int> Carset;
public:
void pushtoset(int &);
void pushtoset(int &&);
}
car.cpp
#include "car.h"
void Car::pushtocar(int &x){
Carset.insert(x);
}
void Car::pushtocar(int &&x){
Carset.insert(x);
}
main.cpp
int main(){
Car object;
int x = 43;
object.pushtocar(x); //this calls pushtocar(int&) version(say version I)
object.pushtocar(54); // this calls pushtocar(int &&) version(say version II)
return 0;
我的问题是在版本 II 的情况下,当这个成员函数的主体完成时,由于在函数主体内参数 x 是一个左值(它是函数的本地值),x 将被销毁。这是否意味着我们在集合中插入的值也将被销毁?如果是这样,我怎样才能防止推到集合上的值不被破坏?我认为与第一个有关的第二个问题是,当我在第二版中写Carset.insert(x); 时,x 会被复制或移动吗?我认为它会被复制。所以如果 x 被复制,那么如果 x 被破坏就没有问题,因为插入的元素和 x 是相互独立的。但是现在如果我写Carset.insert(std::move(x));,那么 x 将被“移动”到集合而不是复制。所以在这种情况下,我们会遇到函数体完成后的问题,x 将被销毁,因此插入的元素也将被销毁。有什么方法可以防止在这个移动的情况下插入集合中的元素,即让 x 处于有效状态以被销毁?我对这个概念的理解是否正确?
【问题讨论】:
-
移动
int只是一个副本...使用std::string而不是int将使示例更有意义。 -
"x 将被销毁,因此插入的元素也将被销毁。" 这不是移动的工作原理。
标签: c++ c++11 rvalue-reference