如果return语句中有+=,为什么不移动对象



我模仿了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;
}

它确实在移动。为什么会这样?

下面的文章对此进行了解释,但简而言之:

    1. 示例:返回一个引用,编译器不能确信该值没有在其他地方使用
    1. 示例:返回本地创建的值,并且可以安全移动

您也可以通过返回std::move(temp += diff)来修复它,但这通常不是首选,因为它会阻止编译器使用返回值优化(RVO(

https://web.mst.edu/~nmjxv3/articles/move-gotchas.html

我不知道为什么Visual Studio没有考虑到这一点。

相关内容

  • 没有找到相关文章

最新更新