Перенос семантики замените семантику копирования в ситуациях, когда копирование неэффективно. Копировать семантику полностью занимается копируемыми объектами, включая объекты const.Пересекают семантику неполной?
Уже существует множество не скопируемых объектов в C++ 11, например std :: unique_ptr. Эти объекты полагаются на семантику переноса полностью, потому что перемещение с объекта позволяет его недействительным. Это важно (imho) для популярных шаблонов дизайна, таких как RAII.
Проблема возникает, когда объект, не скопируемый константой, присваивается области памяти. Такой объект нельзя каким-либо образом восстановить.
Это, очевидно, важно во время жизни объекта из-за его постоянной. В конце его жизни, когда деструктор вызывается, объект (несуществующий) ненадолго ненастроен.
Я предлагаю, чтобы перемещение деструктор мог бы стать ценным дополнением к семантической модели перемещения.
Рассмотрим простую ситуацию, когда unique_ptr используется в unordered_set. Вы можете использовать insert
с помощью конструктора перемещения (или построить «emplace»), однако, если вы хотите переместить этот указатель на другой неупорядоченный_set (т. Е. Сохраняя его const), это было бы невозможно.
Существенный, есть iterator insert((possibly const) key&&)
, но нет const key&& erase(iterator)
. На самом деле это было бы невозможно. Контейнер может быть расширен только для возврата указателя на ключ и забыть об этом.
Перемещающийся деструктор может решить это, например, const MyClass&& ~MyClass()
, поскольку он будет нарушать только const во время разрушения (когда компилятор считает объект недействительным в любом случае).
EDIT: Я должен указать, что const MyClass&& ~MyClass() const
на самом деле имеет больше смысла. Деструктор не должен изменять anyhting, только уничтожает объект, как если бы он больше не был действительным дескриптором для любого контролируемого им ресурса.
объекты Const также не 'const' во время строительства. – woolstar
Более подходящий форум для этого был бы одним из первых 2 на этой странице: http://isocpp.org/forums –
По существу он копировал бы только то, что ему нужно (это то, что означает движение в C++ 11), в новый объект, а затем уничтожает старый, как обычный ход, но происходит, но для не-temp – user3125280