[過去ログ] プログラミング言語 Rust 4 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
35(1): 2017/10/26(木)17:41 ID:iL6gP4TT(1/2)調 AAS
typedef struct Foo {
int x;
int * x_ref;
} Foo;
Foo foo;
foo.x = 11;
foo.x_ref = &foo.x;
C で書くとこんな感じになる、自分の要素への参照を要素として持つ構造体って、Rust じゃもしかして書けない?
苦心してこんなん書いてもやっぱ無理だし。
use std::mem;
struct Foo<'a> {
x: i32,
x_ref: &'a i32,
}
impl<'a> Foo<'a> {
fn new() -> Self {
let mut foo = Foo {
x: 32,
x_ref: unsafe { mem::uninitialized() },
};
foo.x_ref = &foo.x;
foo
}
}
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
}
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.047s