首页 > 解决方案 > 为什么叫copy assignment而不是move assignment?

问题描述

这是我的测试课。VTX 既有复制分配又有移动分配。VTZ 有一个构造函数VTS&&来初始化它的vtx成员。

    struct VTX
    {
    int x;
    vector<int> vts;

    VTX & operator= (const VTX & other)
    {
        x = other.x;
        vts = other.vts;
        cout << "copy assignment\n";
        return *this;
    }

    VTX & operator= (VTX && other)
    {
        x = other.x;
        vts = std::move(other.vts);
        cout << "move assignment\n";
        return *this;
    }

    };

    struct VTZ
    {
    VTX vtx;
    VTZ(VTX && vvv)
    {
        vtx = vvv;
    }

    VTZ()
    {}
    };

测试代码:

    int main(VOID)
    {
        VTX vtx;
        vtx.vts.resize(10);
    
        VTZ vtz(std::move(vtx));
        return 0;
    }

我认为在构建 VTZ 时会调用 VTX 的移动分配。但

输出:

复制作业

我真的很困惑为什么叫复制分配而不是移动分配?

标签: c++c++11

解决方案


因为vvv是一个左值表达式(甚至它的类型是VTX &&)。类型和值类别是不同的东西。

以下表达式是左值表达式:

  • 变量、函数, a template parameter object (since C++20)或数据成员的名称,与类型无关,例如std::cin or std::endl。即使变量的类型是右值引用,由其名称组成的表达式也是左值表达式;

您可以使用std::move将其转换为右值(xvalue)表达式,

VTZ(VTX && vvv)
{
    vtx = std::move(vvv);
}

推荐阅读