[過去ログ] プログラミング言語 Rust 4 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
58: 2017/10/30(月)21:06 ID:4dqnj7Aj(1/2)調 AAS
>>35
まず、そのままのコードでは new() の返り値が move されるときに
&x のアドレスが変わってしまう(実際には最適化で move されない
だろうけど言語仕様的には)ので、そのコードがエラーになるのは正当。
なので x か Foo 全体を box 化する必要がある。ただ box 化すれば
コンパイルが通るかというと、 box を deref して得られる参照は box
の中身の寿命ではなく box 自身の寿命になるので、 transmute で
チートする必要がある。

fn new() -> Self {
let mut foo = Box:new(Foo {
x: 32,
x_ref: unsafe { mem::uninitialized() },
});
foo.x_ref = unsafe{ mem::transmute::<_, &'static _>(&foo.x) };
foo
}
59: 2017/10/30(月)21:26 ID:4dqnj7Aj(2/2)調 AAS
失礼。コンパイル通らないコードを貼り付けてしまった。

fn new() -> Box<Self> {
let mut foo = Box::new(Foo {
x: 32,
x_ref: unsafe { mem::uninitialized() },
});
foo.x_ref = unsafe { mem::transmute(&foo.x) };
foo
}
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.050s