此问题已在此处有答案:
Do built-in types have move semantics?(1个答案)
copy vs std::move for ints(4个答案)
3天前关闭。
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:50J:50
String:name:Mahesh*
2条答案
按热度按时间ia2d9nvy1#
std::move
是一个右值引用的转换。这 * 可以 * 改变重载解析,特别是关于构造函数。int
是一个基本类型,它没有任何构造函数。int
初始化的定义不关心表达式是const
,volatile
,左值还是右值。因此行为是复制。这种情况的一个原因是(破坏性)移动没有任何好处。另一个原因是没有“空”
int
这样的东西,在这个意义上有“空”std::string
s和“空”std::unique_ptr
sz9zf31ra2#
std::move()
本身实际上并不做任何移动。它只是用来指示对象 * 可以 * 被移动。实际的移动必须通过移动构造函数/移动赋值运算符为相应的类型实现。std::move(x)
返回x
的一个未命名的右值引用。右值引用实际上就像普通的引用一样。它们唯一的目的就是沿着关于它们所引用的东西的“右值性”的信息。当你然后使用std::move()
的结果来初始化/赋值给另一个对象时,重载解析将选择一个移动构造函数/移动赋值操作符(如果存在的话)。就是这样。这就是std::move()
所做的全部工作。然而,移动构造函数/移动赋值运算符的实现知道,只有在传递给它的值即将过期时才能调用它因此,它可以安全地“窃取”值而不是进行复制,无论这在特定类型的上下文中可能意味着什么。从对象中“窃取”一个值究竟意味着什么,这个问题没有通用的答案。无论谁定义了一个类型,都必须定义移动这个类型的对象是否有意义,以及这样做究竟意味着什么(通过声明/定义相应的成员函数)。内置类型没有为移动它们的值定义任何特殊的行为。因此,在
int
的情况下,您只会得到初始化int
时所得到的内容,该内容引用另一个int
,这是一个副本...