生のポインタを含む構造体にライフタイムを適用するにはどうすればよいですか?

マイク・クライン
extern crate core;
use core::ops::{Deref, DerefMut};

struct MutPtr<'a,T>{
    ptr: *mut T
}
impl<'a,T> MutPtr<'a,T>{
    fn new<'b>(value: &'b mut T) -> MutPtr<'b,T>{
        MutPtr{ptr: value}
    }
}
impl<'a,T> Deref for MutPtr<'a,T>{
    type Target = T;
    fn deref(&self) -> &T{
        unsafe{
            &(*self.ptr)
        }
    }
}
impl<'a,T> DerefMut for MutPtr<'a,T>{
    fn deref_mut(&mut self) -> &mut T{
        unsafe{
            &mut (*self.ptr)
        }
    }
}
struct Bar{
    v: i32
}

fn err<'a>() -> MutPtr<'a,Bar>{
    let mut b      = Bar{v:42};
    MutPtr::new(&mut b) // Shouldn't this throw an error?
}

fn main(){
    let mut b      = Bar{v:42};
    let mut ptr_b  = MutPtr::new(&mut b);
    let mut ptr_b1 = MutPtr::new(&mut b);

    ptr_b.v = 10;
    println!("{}",b.v);
    ptr_b1.v = 21;
    println!("{}",b.v);
}

このコードブロックは、いくつかの混乱を引き起こしています。

fn err<'a>() -> MutPtr<'a,Bar>{
    let mut b      = Bar{v:42};
    MutPtr::new(&mut b) // Shouldn't this throw an error?
}

なぜこれがコンパイルされるのですか?

私が電話するとき

MutPtr::new(&mut b)

それはbの寿命を持つべきではありませんか?ライフタイム 'aがMutPtr <' b、Bar>のライフタイムよりも長いため、コンパイルエラーが予想されました。

Vaelden

私はあなたが探しているのはcore::marker::ContravariantLifetime(でも利用可能ですstd::marker::ContravariantLifetimeだと思います何が起こるかというと、コンパイラはポインタ変数にライフタイムを割り当てないので、グローバル構造のライフタイムは内部にあるものによって制約されません(あなたの場合はそうすべきですが) )

これを行う方法はContravariantLifetime、構造体にマーカーを追加することです。これにより、コンパイラーは、推測されたライフタイムがマーカー内のライフタイムよりも長い場合、構造体全体のライフタイムをマーカー内のライフタイムに短縮するように指示されます。

したがって、最終的には、構造体は次のようになります。

struct MutPtr<'a,T>{
    ptr: *mut T,
    marker: ContravariantLifetime<'a>,
}

impl<'a,T> MutPtr<'a,T>{
    fn new<'b>(value: &'b mut T) -> MutPtr<'b,T>{
        MutPtr{ptr: value, marker: ContravariantLifetime::<'b>}
    }
}

これにより、予想されるエラーが発生します b does not live long enough

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

スレッド間でファントムポインタを含む構造体を共有するにはどうすればよいですか?

分類Dev

ポインターを含む構造体へのポインターにcudaMalloc / cudaMemcpyを使用するにはどうすればよいですか?

分類Dev

null許容関数ポインタを含むFFIの構造体を作成するにはどうすればよいですか?

分類Dev

構造体へのポインタの配列を作成するにはどうすればよいですか?

分類Dev

Cの構造体へのポインタを逆参照するにはどうすればよいですか?

分類Dev

構造体へのポインタを持つ構造体フィールドを取得するにはどうすればよいですか?

分類Dev

Cの構造体にポインタを割り当てるにはどうすればよいですか?

分類Dev

構造体が参照されている他の構造体の存続期間を超えないように、生のポインターを使用して構造体でPhantomDataを使用するにはどうすればよいですか?

分類Dev

Goでデータ構造を含む構造体のサイズを取得するにはどうすればよいですか?

分類Dev

Parity Substrateカスタムランタイムで汎用構造体を使用するにはどうすればよいですか?

分類Dev

構造体にnullポインタを作成するにはどうすればよいですか?

分類Dev

ライフタイムが異なる複数のstr変数を使用して構造体を構築するにはどうすればよいですか?

分類Dev

構造体初期化子でポインタ型を使用するにはどうすればよいですか?

分類Dev

マップで構造体ポインタを使用するにはどうすればよいですか?

分類Dev

jsonb列をスキャンして構造体/ポインタのスライスにするにはどうすればよいですか?

分類Dev

インターフェイススライスで構造体変数の値を設定するにはどうすればよいですか?

分類Dev

golangのスライスから構造体ポインタを取得するにはどうすればよいですか

分類Dev

その配列へのポインタを使用して、構造体の配列に含まれる構造体のフィールドにアクセスするにはどうすればよいですか?[C ++]

分類Dev

構造体と実装のライフタイムを使用して、実装の適切なライフタイムを推測するにはどうすればよいですか?

分類Dev

Cでポインタを含む構造体をコピーする-それはどのように機能しますか?

分類Dev

VecDeque <Box <dyn Trait >>にライフタイムを適用するにはどうすればよいですか?

分類Dev

構造体を物理的に作成せずに、構造体のReflect.Typeインスタンスを取得するにはどうすればよいですか?

分類Dev

Windows winsock send()を介してポインタを含む構造を送信するにはどうすればよいですか?

分類Dev

構造体のポインタで[]バイトをキャストするにはどうすればよいですか?

分類Dev

従来のCAPIを呼び出すときに、最新のC ++で構造体へのポインターを他の構造体へのポインターに正しくキャストするにはどうすればよいですか?

分類Dev

構造体へのポインタを保持するグローバル配列を初期化するにはどうすればよいですか?

分類Dev

構造体内のポインタ変数を変更するにはどうすればよいですか?

分類Dev

インスタンス化のために構造体のフィールドに制約を追加するにはどうすればよいですか?

分類Dev

異なる構造体へのポインターに同じ関数を実装するにはどうすればよいですか?

Related 関連記事

  1. 1

    スレッド間でファントムポインタを含む構造体を共有するにはどうすればよいですか?

  2. 2

    ポインターを含む構造体へのポインターにcudaMalloc / cudaMemcpyを使用するにはどうすればよいですか?

  3. 3

    null許容関数ポインタを含むFFIの構造体を作成するにはどうすればよいですか?

  4. 4

    構造体へのポインタの配列を作成するにはどうすればよいですか?

  5. 5

    Cの構造体へのポインタを逆参照するにはどうすればよいですか?

  6. 6

    構造体へのポインタを持つ構造体フィールドを取得するにはどうすればよいですか?

  7. 7

    Cの構造体にポインタを割り当てるにはどうすればよいですか?

  8. 8

    構造体が参照されている他の構造体の存続期間を超えないように、生のポインターを使用して構造体でPhantomDataを使用するにはどうすればよいですか?

  9. 9

    Goでデータ構造を含む構造体のサイズを取得するにはどうすればよいですか?

  10. 10

    Parity Substrateカスタムランタイムで汎用構造体を使用するにはどうすればよいですか?

  11. 11

    構造体にnullポインタを作成するにはどうすればよいですか?

  12. 12

    ライフタイムが異なる複数のstr変数を使用して構造体を構築するにはどうすればよいですか?

  13. 13

    構造体初期化子でポインタ型を使用するにはどうすればよいですか?

  14. 14

    マップで構造体ポインタを使用するにはどうすればよいですか?

  15. 15

    jsonb列をスキャンして構造体/ポインタのスライスにするにはどうすればよいですか?

  16. 16

    インターフェイススライスで構造体変数の値を設定するにはどうすればよいですか?

  17. 17

    golangのスライスから構造体ポインタを取得するにはどうすればよいですか

  18. 18

    その配列へのポインタを使用して、構造体の配列に含まれる構造体のフィールドにアクセスするにはどうすればよいですか?[C ++]

  19. 19

    構造体と実装のライフタイムを使用して、実装の適切なライフタイムを推測するにはどうすればよいですか?

  20. 20

    Cでポインタを含む構造体をコピーする-それはどのように機能しますか?

  21. 21

    VecDeque <Box <dyn Trait >>にライフタイムを適用するにはどうすればよいですか?

  22. 22

    構造体を物理的に作成せずに、構造体のReflect.Typeインスタンスを取得するにはどうすればよいですか?

  23. 23

    Windows winsock send()を介してポインタを含む構造を送信するにはどうすればよいですか?

  24. 24

    構造体のポインタで[]バイトをキャストするにはどうすればよいですか?

  25. 25

    従来のCAPIを呼び出すときに、最新のC ++で構造体へのポインターを他の構造体へのポインターに正しくキャストするにはどうすればよいですか?

  26. 26

    構造体へのポインタを保持するグローバル配列を初期化するにはどうすればよいですか?

  27. 27

    構造体内のポインタ変数を変更するにはどうすればよいですか?

  28. 28

    インスタンス化のために構造体のフィールドに制約を追加するにはどうすればよいですか?

  29. 29

    異なる構造体へのポインターに同じ関数を実装するにはどうすればよいですか?

ホットタグ

アーカイブ