error[E0507]: cannot move out of 'x' which is behind a shared reference
Rustで共有参照から所有権を移動しようとした際のコンパイルエラー
概要
Rustで共有参照(&T)を通じて値の所有権を移動(ムーブ)しようとした際に発生するコンパイルエラーです。共有参照は読み取り専用であり、所有権を奪うことはできません。
エラーメッセージ
error[E0507]: cannot move out of `*x` which is behind a shared reference
--> src/main.rs:5:5
|
5 | *x
| ^^ move occurs because `*x` has type `String`, which does not implement the `Copy` trait
原因
- 参照からのムーブ: 共有参照を通じて所有権を移動しようとしている
- Copy未実装: 型がCopyトレイトを実装していない
- 構造体のフィールドアクセス: 参照を通じてフィールドをムーブしようとしている
- イテレータ: 参照イテレータから値をムーブしようとしている
解決策
1. clone()を使用
| |
2. 参照を返す
| |
3. 所有権を受け取る
| |
4. Option::take()やstd::mem::take()
| |
5. Vec::remove()やVec::swap_remove()
| |
6. イテレータでinto_iter()を使用
| |
7. Cow(Clone-on-Write)を使用
| |
8. マッチでref/ref mutを使用
| |
よくある間違い
&Vec<T>をイテレートして要素の所有権を得ようとする- 構造体の参照からフィールドをムーブしようとする
- Copy実装型と非Copy型の挙動の違いを忘れる
関連エラー
参考リンク
Rust の他のエラー
この記事は役に立ちましたか?