c++ - 如果 += 在 return 语句中,为什么不移动对象
问题描述
std::vector::operator+()
我是从 Visual Studio模仿的。它看起来类似于:
A operator+(const int diff) const {
A temp = *this;
return temp += diff;
}
虽然我有一个移动构造函数,它使用复制构造函数,但是当我使用它时:
A operator+(const int diff) const {
A temp = *this;
temp += diff;
return temp;
}
它确实在移动。为什么是这样?
解决方案
下面的文章解释了它,但简而言之:
-
- 示例:返回一个引用,编译器无法确信该值未在其他地方使用。
-
- 示例:返回本地创建的值并且可以安全移动。
您也可以通过返回来修复它std::move(temp += diff)
,但这通常不是首选,因为它会阻止编译器使用返回值优化 (RVO)。
https://web.mst.edu/~nmjxv3/articles/move-gotchas.html
为什么 Visual Studio 不考虑这一点,我不知道。
推荐阅读
- vba - Userform VBA 在打印前选择打印机
- javascript - 错误:未定义不是反应原生的函数
- java - 为我的 MSSQL 配置加载 bean 对象时出现 AbstractMethodError
- android - Adobe Phonegap 推送通知与 Android 上的 Firebase Cloud
- excel - 使用通配符从其他工作簿中获取数据 ERROR
- android - Android Studio : 您在 android studio 中被此服务器永久封禁
- shell - IntelliJ IDEA 中的“Clear All”快捷方式,sbt-shell 窗口
- actionscript-3 - 闪投接球游戏
- elasticsearch - Elasticsearch/Logstash 错误:com.mysql.jdbc.Driver 未加载 - 无法在服务器上找到 mysql-connector-java-5.1.36-bin.jar
- bootstrap-4 - Bootstrap 折叠手风琴头和身体分离