对于您为什么要使用/需要移动构造函数,我有些困惑。
如果我有以下情况:

vector fill(istream& is)
{
    vector res;
    for(double x; is >> x; res.push_back(x));
    return res;
}

void bar()
{
    vector vec = fill(cin);
    // ... use vec ...
}

我可以通过添加vector fill(istream& is, vector& res)来消除返回res的需要,因此不必调用copy构造函数。

那么拥有move构造函数有什么意义呢?

最佳答案

假设您接下来将std::vector<T>放入std::vector<std::vector<T>>中(如果您认为 vector 不应该嵌套,则假设内部类型为std::string并假设我们正在讨论std::string的move构造函数):即使您可以添加一个空对象并填充它在原位,最终将需要在调整大小后重新定位 vector ,这时移动元素会派上用场。

请注意,从函数返回并不是移动构造的主要动机,至少不是在效率方面:在效率很重要的情况下,结构化代码以启用复制删除功能甚至可以通过避免移动来进一步提高性能。

但是,由于在返回时要求类型是可复制的或可移动的,因此move构造函数在语义上仍可能是相关的。某些类型(例如流)是不可复制的,但它们是可移动的,可以通过这种方式返回。

10-07 20:02
查看更多