[英]Generic bound ensuring non-reference argument
這樣做的真正原因超出了 scope,我只能說這與某些嵌入式平台上非常不尋常的 memory 布局有關。 目標是為靜態做一個包裝器,它可以在取消引用時做一些手動地址轉換。 所以在里面放一個引用是沒有意義的,也是不安全的。 或者,我可以為引用和非引用創建兩個實現,但它們必須非常明確。
你可以這樣做,但它需要夜間功能negative_impls
和auto_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.