Почему move on std :: map не может переместить элемент с одной карты на другую - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь попрактиковаться в перемещении одного элемента карты на другой - поэтому я попробовал следующий код:

using namespace std;

int main(void)
{
    /* Initializer_list constructor */
    map<char, int> m =
    {
        {'a', 1},
        {'b', 2},
        {'c', 3},
        {'d', 4},
        {'e', 5},
    };

    cout << "Move element from one map to another" << endl;
    /*
    char temp;
    temp = map1[key1];
    map2[key1]=temp;
    map1.erase(key1)
    */
    string a = "hello";
    string b = move(a);
    cout << "a=" << a << " b=" << b << endl; // here string **a** is NULL as value is moved
    auto s = move(m['a']);
    cout << "s=" << s << " m=" << m['a'] <<  endl; // here 
} 

Вывод:

Move element from one map to another                                                                                        
a= b=hello                                                                                                              
s=1 m=1                    

Почему операция перемещения не выполняется для std :: map STL container - я ожидал, что после m ['a'] будет пусто?

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Нигде ваш код не удаляет объект с карты. Для этого потребуется операция с картой, а не с объектом на ней. Никакая операция с объектом на карте не приведет к удалению этого объекта с карты.

Операция, которую вы выполняете над объектом на карте, заключается в перемещении его значения из него. Состояние объекта после того, как он был перемещен, является допустимым, но неопределенным.

Таким образом, объект на карте находится в допустимом, но неопределенном состоянии.

0 голосов
/ 20 июня 2020

Почему операция перемещения не работает для std::map контейнера STL - я ожидал, что после того, как m['a'] будет пустым?

Это ожидание необоснованно.

Оператор

auto s = move(m['a']);

оставляет m['a'] как есть по нескольким причинам.

  1. Этот оператор можно представить как:

    int&& s = move(m['a']);
    

    Т.е. он просто фиксирует ссылку на объект на карте. Фактически он не перемещает его.

  2. Операция перемещения на int не изменяет перемещаемый объект. Семантика перемещения имеет значение только для конструкторов перемещения классов. Для встроенных типов это oop. Даже для классов, которые фактически не получают никаких ресурсов, кроме переменных-членов, конструктор перемещения мало что может сделать.

Кроме того, не существует такой вещи, как пустой int. Понятие пустоты имеет смысл только для контейнеров.

...