Может ли Box перемещать свое содержимое, когда перемещается весь Box?

Если я Box::new возьму значение, возьму указатель на него (программа проверки заимствования не позволит взять ссылку, так как я собираюсь переместить поле), а затем переместлю Box, можно ли переместить значение (например, перераспределение) происходит?

Я думал, что Box просто хранит адрес значений, так что перемещение Box приведет только к перемещению адреса. Поэтому есть ли причина, по которой средство проверки заимствования запрещает перемещать его, когда его содержимое неизменно заимствовано?

Игровая площадка


person DrunkCoder    schedule 16.11.2020    source источник
comment
Содержимое не будет перемещаться при перемещении ящика, но было бы невозможно статически гарантировать действительность ссылок, если средство проверки заимствования разрешало ссылки на содержимое ящика при перемещении ящика.   -  person Sven Marnach    schedule 16.11.2020
comment
@SvenMarnach Да, но почему он жалуется при перемещении коробки? Разве заимствованный чекер не может отличить коробку и данные внутри нее, которые находятся за указателем? Адрес указателя можно эффективно скопировать.   -  person DrunkCoder    schedule 16.11.2020
comment
Редактировать: я неправильно понял конец вашего комментария. Теперь я понимаю, что проблема может заключаться в том, что он не знает, когда будут удалены данные. Это предотвращает прогнозирование времени жизни ссылки, которую вы берете на содержимое. Что он может гарантировать, так это то, что ссылка действительна до тех пор, пока блок не перемещается.   -  person DrunkCoder    schedule 16.11.2020
comment
В яблочко. Средство проверки заимствования работает локально с отдельными функциями. Если вы переместите поле, потенциально из текущей функции, средство проверки заимствования больше не сможет рассуждать о времени жизни содержимого. Хотя можно сделать средство проверки заимствования более общим, чем оно есть в настоящее время, существуют теоретические пределы того, что оно когда-либо сможет доказать.   -  person Sven Marnach    schedule 16.11.2020


Ответы (1)


Нет, перемещение Box не приведет к перемещению значения в куче.

Box гарантирует:

Box<T> гарантированно будет представлен как один указатель

И Rust гарантирует, что перемещения всегда являются побитовыми копиями (если они вообще копируются).

Поэтому есть ли причина, по которой средство проверки заимствования запрещает перемещать его, когда его содержимое неизменно заимствовано?

Это покрывается:

person Shepmaster    schedule 16.11.2020