Простой ответ, необработанный указатель не является умным указателем, поэтому нет, перемещение по простым типам не очистит перемещение от значения или, по крайней мере, не гарантирует этого. Почему нужно перемещать указатель на исходный указатель, перемещенный из значения в nullptr
? У него нет понятия delete
или что двойной delete
может быть чем-то злым или нежелательным. Перемещение просто гарантирует, что объект останется в действительном, но неуказанном состоянии и сделать перемещение простых типов более сложными и неэффективными, чем копирование, безусловно, будет противоречить друг другу. Любая семантика выше «Хранить адрес для меня» - это специальные типы интеллектуальных указателей и возможность повторного использования простого необработанного указателя.
Ваш язык означает, что вы ожидаете, что 'a' будет NULL, если у него есть специальный конструктор перемещения. Зачем? Перемещение конструкторов для нормальных классов также не делает такой гарантии. –
@Benjamin Lindley Я думал, что, возможно, a будет установлен в NULL, поэтому, если мне когда-нибудь понадобится удалить указатель, это не будет иметь никакого эффекта (поскольку значение, которое было перенесено) – lezebulon
Конструктор перемещения просто должен покинуть RHS в состоянии, в котором можно либо уничтожить (то есть выйти из сферы действия), либо переназначить (или какую-либо другую операцию без предварительных условий). И это всегда безопасные операции для таких основных типов, как указатели. –