为什么std :: move()没有窃取int值?

时间:2018-07-19 13:48:59

标签: c++11

std :: move()正在窃取字符串值,而不是int,请帮助我。

int main()
{
    int i = 50;
    string str = "Mahesh";        
    int j = std::move(i);
    string name = std::move(str);       
    std::cout <<"i: "<<i<<" J: "<<j <<std::endl;        
    std::cout <<"str: "<<str<<" name: "<<name <<std::endl;
    return 0;        
}

输出

i:50 J:50
str:名称:Mahesh

2 个答案:

答案 0 :(得分:1)

reload: boolean = false; contentToReload: number = 6; public ngAfterContentChecked(): void { if(this.reload){ this.contentToReload--; if(this.contentToReload == 0) { this.blockUI.stop(); window.scroll(0,0); //for edge window.scrollTo(0,0); //for chrome this.contentToReload = 6; this.reload = false; } } } public setAsCorrect(): void { this.dataService.setAsCorrect(this.data) .subscribe(apiResult => { if (apiResult.result.isAnyDataLeft) { this.reload = true; this.getData(); } else { this.RoutingService.navigateTo(null); } }); } 是对右值引用的强制转换。 可以更改重载分辨率,尤其是对于构造函数而言。

std::move是基本类型,它没有任何构造函数。 int初始化的定义并不关心表达式是intconst,左值还是右值。因此,该行为是副本。

是这种情况的一个原因是(破坏性)举动没有任何好处。另一个原因是,就没有“空” volatile和“空” int

而言,没有“空” std::string这样的东西。

答案 1 :(得分:0)

std::move()本身实际上并不做任何移动。它仅用于指示对象 可能从中移出。必须通过移动构造函数/移动分配运算符为各个类型实现实际的移动。

std::move(x)返回对x的未命名右值引用。右值引用实际上就像普通引用一样。它们的唯一目的仅仅是携带有关它们所指事物的“右值性”的信息。然后,使用std::move()的结果初始化/分配给另一个对象时,重载解析将选择一个move构造函数/ move分配运算符(如果存在)。就是这样。实际上,这就是std::move()的全部工作。但是,move构造函数/ move赋值运算符的实现知道,唯一可以调用的方法是传递给它的值即将到期时(否则,将改为调用复制构造函数/ copy赋值运算符)。因此,无论在特定类型的上下文中意味着什么,它都可以安全地“窃取”值而不是进行复制。

这个问题没有普遍的答案,“窃取”对象的值到底意味着什么。定义类型的人必须定义移动此类型的对象是否有意义以及这样做的确切含义(通过声明/定义相应的成员函数)。内置类型没有定义用于移动其值的任何特殊行为。因此,在使用int的情况下,您将得到初始化int并引用另一个int(即副本...)的结果。