質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

4782閲覧

Box はなぜ中身をムーブできるのか

Eki

総合スコア429

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

1グッド

0クリップ

投稿2018/02/26 18:46

次のようにすると BoxBox の中身をムーブすることができます。

rust

1struct S; 2let s = Box::new(S); 3*s; // OK

この Box のような型を作ろうと考えたとします。 *Deref トレイトによってオーバーロードできるので次のようになるはずです。

rust

1struct S; 2struct U(S); 3impl std::ops::Deref for U { 4 type Target = S; 5 fn deref(&self) -> &S { 6 &self.0 7 } 8} 9let s = U(S); 10*s; // Error: cannot move out of borrowed content

しかし、借用した値をムーブできない旨のエラーがでます。それは確かに Deref&self を取っているので分かるのですが、これは Box でも同様なはずです。

なぜ Box では中身をムーブすることができるのですか?特別扱いなのでしょうか。
また、こういう型をユーザー定義することはできるのでしょうか。

equal-l2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Box はコンパイラに特別扱いされていて、deref move と呼ばれる振る舞いが可能です。このような型をユーザーが定義することはできません。将来は変わるかもしれませんが、いまは目立った進展はないようです。

Box はどんな風に特別で、どういう経緯でこうなったのかは、以下の記事で解説されています。

簡単にまとめると、

  • Rust 1.0 以前、Box<T> 型は存在せず、 ~T という構文が使われていた。
  • ~ は所有していることを意味していたが、色々と混乱の元になり 1.0 リリース前に取り除かれた。
  • 最終的には Box<T> という型(見かけ上のユーザー定義型)になったが、コンパイラの内部では今でも特別扱いされている。
  • deref move のような振る舞いをユーザーが定義できるようになるには、言語機能が足りない。

なお記事中の "it literally is treated as a completely new kind of type" では、コンパイラ内部の型を表す enum の TyBox の定義にリンクされていますが、その後、少し整理されて、現在では TyAdt の一部になっているようです。

投稿2018/02/27 01:07

編集2018/02/27 02:16
tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eki

2018/02/27 03:22

回答ありがとうございます。 なるほど、歴史的経緯なんですね。参考サイト、とても興味深く読ませていただきました。 もし DerefMove というトレイトが導入されればユーザー定義型にも実装できるようになる、ということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問