c++ 为什么std::move()没有窃取一个int值?

kmynzznz  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(181)

此问题已在此处有答案

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*

ia2d9nvy

ia2d9nvy1#

std::move是一个右值引用的转换。这 * 可以 * 改变重载解析,特别是关于构造函数。
int是一个基本类型,它没有任何构造函数。int初始化的定义不关心表达式是constvolatile,左值还是右值。因此行为是复制。
这种情况的一个原因是(破坏性)移动没有任何好处。另一个原因是没有“空”int这样的东西,在这个意义上有“空”std::string s和“空”std::unique_ptr s

z9zf31ra

z9zf31ra2#

std::move()本身实际上并不做任何移动。它只是用来指示对象 * 可以 * 被移动。实际的移动必须通过移动构造函数/移动赋值运算符为相应的类型实现。
std::move(x)返回x的一个未命名的右值引用。右值引用实际上就像普通的引用一样。它们唯一的目的就是沿着关于它们所引用的东西的“右值性”的信息。当你然后使用std::move()的结果来初始化/赋值给另一个对象时,重载解析将选择一个移动构造函数/移动赋值操作符(如果存在的话)。就是这样。这就是std::move()所做的全部工作。然而,移动构造函数/移动赋值运算符的实现知道,只有在传递给它的值即将过期时才能调用它因此,它可以安全地“窃取”值而不是进行复制,无论这在特定类型的上下文中可能意味着什么。
从对象中“窃取”一个值究竟意味着什么,这个问题没有通用的答案。无论谁定义了一个类型,都必须定义移动这个类型的对象是否有意义,以及这样做究竟意味着什么(通过声明/定义相应的成员函数)。内置类型没有为移动它们的值定义任何特殊的行为。因此,在int的情况下,您只会得到初始化int时所得到的内容,该内容引用另一个int,这是一个副本...

相关问题