【问题标题】:Why string data is not moved to target but vector was为什么字符串数据没有移动到目标但向量被移动
【发布时间】:2021-03-25 04:00:43
【问题描述】:

我有以下代码:

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);
}

代码的输出是:

vec size = 5                                                                                                            
nvec size = 5                                                                                                           
vec size = 0                                                                                                            
Hello and that.data Hello   

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

【问题讨论】:

  • Const 对象不可移动。您可以在任何现代 C++ 书籍中了解这一点。

标签: c++ c++11 c++14


【解决方案1】:

您将参数that 声明为const。结果,data = std::move(that.data); 调用复制赋值运算符,而不是移动赋值运算符。移动操作应该是对要移动的对象进行修改,不应该是const

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

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

然后

string s;
string s1(std::move(s));

LIVE

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多