簡體   English   中英

通用邊界確保非引用參數

[英]Generic bound ensuring non-reference argument

這樣做的真正原因超出了 scope,我只能說這與某些嵌入式平台上非常不尋常的 memory 布局有關。 目標是為靜態做一個包裝器,它可以在取消引用時做一些手動地址轉換。 所以在里面放一個引用是沒有意義的,也是不安全的。 或者,我可以為引用和非引用創建兩個實現,但它們必須非常明確。

你可以這樣做,但它需要夜間功能negative_implsauto_traits

#![feature(negative_impls)]
#![feature(auto_traits)]

auto trait NotRawRef {}

impl<T> !NotRawRef for &T {}
impl<T> !NotRawRef for &mut T {}

fn foo<T: NotRawRef>(_: T) {}

這將默認遞歸應用,因此T不能是包含引用的用戶定義類型——除非用戶定義類型顯式實現NotRawRef 你必須相信你的 function 的呼叫者不會在不合適的時候實現這個特性。


如果 nightly 不是一個選項,或者如果這太嚴格,您可以很容易地使用'static綁定“如果有任何引用,它們必須具有 static 生命周期”。 例如:

fn foo<T: 'static>(_: T) { }

fn main() {
    let x = 1;
    foo(x);

    // The following line would fail with E0597:
    // foo(&x);

    // Works because the reference has static lifetime
    foo(&1);
}

此綁定也適用於具有通用生命周期參數的用戶定義類型,並且將拒絕任何具有非'static生命周期參數的此類類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM