首页 > 解决方案 > 如果 += 在 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;
}

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

标签: c++move

解决方案


下面的文章解释了它,但简而言之:

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

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

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

为什么 Visual Studio 不考虑这一点,我不知道。


推荐阅读