繁体   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