Есть ли необходимость в конструкторе копирования и назначении? - PullRequest
0 голосов
/ 22 мая 2018

Я прочитал две статьи о stackOverflow, одна из которых описывает идиому копирования и обмена, а другая говорит о семантике перемещения, но я не понимаю, почему мы должны поменять местами оператор присваивания, когда конструктор перемещения или конструктор копирования уже сделал этодля нас

так что из того, что я понимаю, как объяснено, если мы используем lvalue, оператор присваивания создаст объект с помощью конструктора копирования, если rvalue, то он создаст объект с помощью конструктора перемещения, поэтому предположим, что мы выбираемпоследний

скажем, у нас есть функция, которая меняет объекты-члены, а ниже - оператор присваивания, поэтому, как я уже сказал, давайте сначала скажем, что у нас есть значение r, оператор = создаст объект с помощью конструктора перемещения, так почему же мынужна ли здесь функция подкачки ??

мы уже выполнили то, что хотим, мы сделали объект с помощью конструктора перемещения и "украли или забрали" данные, которые нам нужны, так что зачем нужен дополнительный своп?

разве мы не делаем то же самое,снова и снова просто поменяться местами?

вот статьи / темы

Что такое семантика перемещения?

Что такое копирование иидиома?

dumb_array& operator=(dumb_array other) // (1)
{
    swap(*this, other); // (2)

    return *this;
}

1 Ответ

0 голосов
/ 22 мая 2018

При назначении объекта есть две проблемы:

  1. Мы хотим получить копию содержимого источника в место назначения.
  2. Мы хотим, чтобы исходное содержимое места назначения было правильно расположеноof.

Так как у нас есть конструктор копирования, первый шаг для нас сделан.Мы могли бы просто move содержать содержимое временной копии в месте назначения, но что насчет второго?

У нас есть деструктор, который занимается утилизацией, так почему бы не использовать его?Если вы меняете содержимое места назначения на содержимое временного объекта, уничтожение временного объекта гарантирует, что оригинал места назначения будет выпущен правильно, без необходимости писать новый код или дублировать существующий код.

Обратите внимание, что копирование и замена могут быть более тяжелымичем вам действительно нужно, но это никогда не выходит из строя (при условии, что функции, на которые он опирается, верны), и это делает его отличным местом для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...