Вы должны различать в зависимости от базового типа.
Вы не можете сделать поверхностную копию struct Foo(String);
, потому что два экземпляра Foo
будут указывать на один и тот же String
, что нарушит правило строгого алиасинга .
Однако, если у вас есть счетчик ссылок, например, struct Foo(Rc<String>);
это возможно, потому что Rc
не позволит вам совершать небезопасные действия, например, с изменяемой ссылкой, когда есть другие ссылки на String
.
Также возможно, чтобы типы, которые реализуют [Clone
], делали "мелкую" копию, поскольку Copy
подразумевает, что тип может быть скопирован с использованием memcpy
(например, u32
или *). 1021 *).
В чем разница между копированием и клоном? также очень стоит прочитать.
Итак, в общем случае нет: Исключениями являются структуры с подсчетом ссылок (Rc
или Arc
), Cloneables
или ссылки (&T
), потому что они не нарушают строгое правило алиасинга.