[英]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.