C++ 为什么字符串数据未移动到目标,但向量已移动

C++ 为什么字符串数据未移动到目标,但向量已移动,c++,c++11,c++14,C++,C++11,C++14,我有以下代码: class string { std::string data; public: string() { data = "Hello"; } string(const string& that) { data = std::move(that.data); std::cout << data << " and that.d

我有以下代码:

class string
{
    std::string data;

public:

    string()
    {
        data = "Hello";
    }
    string(const string& that)
    {
        data = std::move(that.data);
        std::cout << data << " and that.data " << that.data;
    }
};

int main()
{
    std::vector<int> vec = { 1, 2, 3, 4, 5 };
    std::cout << "vec size = " << vec.size() << std::endl;
    std::vector<int> nvec = std::move(vec);
    std::cout << "nvec size = " << nvec.size() << std::endl;
    std::cout << "vec size = " << vec.size() << std::endl;
    string s;
    string s1(s);
}

为什么没有像nvec和vec一样将that.data移动到目标数据中?

您正在将参数
声明为
const
。结果,
data=std::move(即.data)调用复制分配运算符,而不是移动分配运算符。移动操作应该对要移动的对象执行修改,而不应该是
const

您可以将参数类型更改为右值引用(非常量)


常量对象不可移动。你可以在任何现代C++书籍中学习到这一点。
vec size = 5                                                                                                            
nvec size = 5                                                                                                           
vec size = 0                                                                                                            
Hello and that.data Hello   
string(string&& that)
{
    data = std::move(that.data);
    std::cout << data << " and that.data " << that.data;
}
string s;
string s1(std::move(s));