Что это означает, что операции перемещения никогда не определяются как удаленные функции - PullRequest
0 голосов
/ 02 февраля 2020

Я читаю C ++ primer 5 edition. до главы 13, в которой говорится о «операциях перемещения»:

В отличие от операций копирования, операция перемещения никогда не подразумевается как неявная функция. Однако если мы явно попросим компилятор сгенерировать операцию перемещения с помощью = default (§ 7.1.4, с. 264), и компилятор не сможет переместить все элементы, тогда операция перемещения будет определена как удаленная. За одним важным исключением, правила, когда синтезированная операция перемещения определяется как удаленная, аналогичны правилам для операций копирования (§ 13.1.6, стр. 508):

  • В отличие от конструктора копирования, конструктор перемещения определяется как удаленный, если в классе есть член, который определяет свой собственный конструктор копирования, но также не определяется конструктор перемещения, или если в классе есть член, который не определяет свои собственные операции копирования и для которого используется компилятор не в состоянии синтезировать конструктор движения. Аналогично для перемещения-присваивания.
  • Конструктор перемещения или оператор назначения перемещения определяются как удаленные, если в классе есть член, собственный конструктор перемещения или оператор назначения перемещения которого удален или недоступен.
  • Как и конструктор копирования, конструктор перемещения определяется как удаленный, если деструктор удален или недоступен.
  • Как и оператор копирования-назначения, оператор перемещения-назначения определяется как удаленный, если у класса есть const или ссылка member.
  • Поэтому я не понимаю, "в отличие от операций копирования, операция перемещения никогда не подразумевается как неявно удаленная функция".

  • Означает ли это, что операции копирования неявно определяются как удаленные операции? если да когда?

  • Другими словами, пожалуйста, объясните разницу между неявными операциями перемещения и соответствующими им операциями копирования.

1 Ответ

1 голос
/ 03 февраля 2020

Означает ли это, что операции копирования неявно определяются как удаленные операции? если да, то когда?

Да.

Когда элементы не могут быть скопированы (например, они не могут быть скопированы).


Поэтому я не понимаю, «в отличие от операций копирования, операция перемещения никогда не подразумевается как неявно удаленная функция».

  • Когда элементы не могут быть скопированы, конструктор копирования удален.
  • Когда элементы не могут быть перемещены, конструктор перемещения не удален. Вместо этого его просто не существует, поэтому вместо него выполняется копия.
    • Если конструктор копирования не был удален! Тогда вы просто не сможете ничего сделать.

Если конструктор перемещения был удален, возникнет немедленная ошибка компиляции, а не попытка использовать вместо этого конструктор копирования.


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

Ключ здесь разница между не объявляя что-то , а объявляя это как удаленное .


Я не знаю, почему книга делает из этого такое большое дело. Разница интересна только в том случае, если интересно, что конструктор копирования иногда удаляется неявно. И не особенно интересно, что конструктор копирования удален, потому что если бы его не было, вы все равно просто не получили бы копию. Не было бы другого конструктора, к которому можно было бы прибегнуть. Ну, я полагаю, учитывая некоторые другие неявные последовательности преобразования, которые, я полагаю, могут быть, так что это немного интересно.

...