При перемещении элемента из контейнера контейнер не опорожняется? - PullRequest
1 голос
/ 06 августа 2020

Учитывая следующий код:

#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 ]

3 голосов
/ 06 августа 2020

std::move даже не знает, что вещь, которую он переместил, находилась в контейнере. Блок памяти, которым владеет вектор, все еще существует, только в неопределенном состоянии. Вам решать управлять вектором.

1 голос
/ 06 августа 2020

После того, как вы использовали значение спереди и хотите избавиться от него, вам потребуется 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...