提问者:小点点

从容器中移动元素是否会清空容器?


给定以下代码:

#include <vector>
#include <iostream>

struct number {
    int n{666};
};


int main()
{
    std::vector<number> vec;
    std::cerr << vec.size() << std::endl;
    number n;
    vec.push_back(n);
    std::cerr << vec.size() << std::endl;
    auto b = std::move(vec.front());
    std::cerr << "b: " << b.n << std::endl;
    std::cerr << vec.size() << std::endl;
}

我得到以下输出:

0
1
b: 666
1

最后的1不应该是0吗?


共2个答案

匿名用户

一旦您使用了前面的值,并且想要删除它,您将需要从向量中erase它。 我将不讨论front()返回一个ref,因为0x5453提到了这一点。 但是没有理由在那里使用std::move-所做的只是将值强制转换为rvalue引用-实际上它自己并不“移动”任何东西。

#include <vector>
#include <iostream>

struct number {
    int n{666};
};

int main()
{
    std::vector<number> vec;
    std::cerr << vec.size() << std::endl;
    number n;
    vec.push_back(n);
    std::cerr << vec.size() << std::endl;

    // Since this is a ref, and your struct is simple - just copy
    auto b {vec.front()};
    // Now remove the element
    vec.erase(vec.begin());

    std::cerr << "b: " << b.n << std::endl;
    std::cerr << vec.size() << std::endl;
}

匿名用户

std::move甚至不知道它移动的东西在容器中。 矢量拥有的内存块仍然在那里,只是处于未指定的状态。 由你来管理矢量。