Является ли деструктор единственной вещью, которая когда-либо вызывалась в RHS хода / назначения? - PullRequest
0 голосов
/ 15 января 2019

Мой поиск-фу хорош, но это сложно сформулировать правильно, чтобы найти ответ. В основном, после вызова ctor / присвоения перемещения гарантируется ли, что единственной вещью, которая когда-либо будет вызываться в RHS, будет деструктор?

Причина, по которой я спрашиваю, состоит в том, что у меня есть разные вещи, которые (ради здравомыслия) не могут быть в недопустимом состоянии. Но, безусловно, самая эффективная схема перемещения заключалась бы в том, чтобы поменять в них некоторые вещи, которые доктор может принять, но больше ничего не может. Иначе, я должен распределять фактические данные, независимо от того, насколько они тривиальны, чтобы поддерживать RHS в правильном состоянии.

Если дтор - единственная вещь, которую когда-либо будут вызывать, тогда я смогу добиться максимальной эффективности.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

гарантируется ли, что единственной вещью, которая когда-либо будет вызываться в RHS, будет деструктор?

Нет. Правильно вызывать функции-члены перемещенного объекта. Стандарт не гарантирует, что программист этого не сделает.

Как разработчик класса, вы можете решить, что некоторые функции-члены не должны вызываться для перемещенного объекта, и, таким образом, можно избежать, например, выделения памяти. Или вы можете решить не иметь такого требования. В общем случае наличие предварительных условий может обеспечить более эффективную реализацию, а отсутствие предварительных условий делает класс более простым в использовании.

Как пользователь класса, вы несете ответственность за выполнение предварительных условий функций-членов, которые вы вызываете (или доступа к элементу). Если предварительным условием функции является то, что класс не находится в перемещенном состоянии, не нарушайте это предварительное условие.

Как правило, это хороший дизайн, позволяющий вызывать оператор присваивания для перемещенного объекта. Это то, что делают все (назначаемые) классы стандартной библиотеки.


Вкратце: стандарт не дает такой гарантии, но вы можете наложить такое требование на пользователя класса. Просто убедитесь, что это хорошо задокументировано.

0 голосов
/ 15 января 2019

В перемещении объекта нет ничего волшебного. После перемещения объект остается действительным, и если он не является временным, ваш код может вызывать функции-члены и передавать его функциям.

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

...