我模仿了Visual Studio中的std::vector::operator+()
。它看起来像这样:
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没有考虑到这一点。