为什么使用 std::move 并分配给 rvalue 不会窃取内部内容?

如何解决为什么使用 std::move 并分配给 rvalue 不会窃取内部内容?

众所周知,如果与非基本类型一起使用,c++ std::move 会窃取内部内容。我突然有一个脑波,如果将左值移动到右值会发生什么。我最初认为它仍然会窃取内容。但是什么也没发生,a 的字符串还在。这是由忽略移动构造函数引起的吗?但我认为编译器认为命名的右值是左值,对吗?

int main()
{
    string a="4";
    string&& c = move(a);
    cout<<a<<endl;
}

解决方法

这是因为 c 被声明为对 a 的引用(右值引用)。它不是一个不同的字符串。为了“静止”(即调用移动构造函数),需要将 c 声明为 string。然后,字符串 a 被“移动”到字符串 c:

int main()
{
    string a="4";
    string c = move(a);
    cout<< "a :" <<a << ":" <<endl;
    
    cout << "c :" << c << ":"<< endl;
}

输出为:

a ::                                                                                                                                           
c :4:

不过,这段代码将右值移动到左值,这是它应该工作的方式。但是,听起来您正在尝试将左值移动到右值,但这不是您要做的。 c 是一个右值,但 move(a) 也是一个右值。 std::move()a 转换为右值引用。将引用视为类似于指针的东西,它不是 string。您不能将字符串移动或复制到它。它只是指字符串。无论如何,我不认为您可以将左值移动到右值。我想不出任何情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?