Generics 是否可以在泛型函数中排除引用参数?

Generics 是否可以在泛型函数中排除引用参数?,generics,reference,rust,traits,Generics,Reference,Rust,Traits,由于泛型类型参数T可以是任何类型,包括引用,我想知道是否可以在泛型函数中选择不引用,即能够编写如下内容: use std::ops::Deref; fn foo<T: !Deref>(x: T) -> T {} 使用std::ops::Deref; fn foo(x:T)->T{} 但是,这是不允许的,并且在解析阶段已经中断 我读过,但它只支持选择退出自动特征,因此也不起作用,因为Deref不是自动特征 有可能做到这一点吗?是的,您可以使用自动特征: #![feature

由于泛型类型参数
T
可以是任何类型,包括引用,我想知道是否可以在泛型函数中选择不引用,即能够编写如下内容:

use std::ops::Deref;

fn foo<T: !Deref>(x: T) -> T {}
使用std::ops::Deref;
fn foo(x:T)->T{}
但是,这是不允许的,并且在解析阶段已经中断

我读过,但它只支持选择退出自动特征,因此也不起作用,因为
Deref
不是自动特征


有可能做到这一点吗?

是的,您可以使用自动特征:

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

auto trait NotReference {}

impl<'a, T> !NotReference for &'a T {}
impl<'a, T> !NotReference for &'a mut T {}

fn no_references<T: NotReference>(_: T) {}

fn main() {
    no_references(42); // OK
    no_references(&42); // the trait bound `&{integer}: NotReference` is not satisfied
    no_references("hello"); // the trait bound `&str: NotReference` is not satisfied

    no_references(vec![1, 2, 3]); // OK

    let x = vec![1, 2, 3];
    no_references(x.iter()); // the trait bound `&{integer}: NotReference` is not satisfied in `std::slice::Iter<'_, {integer}>`
}

为什么?如果你的函数可以在任何类型上运行,为什么不应该在引用上运行呢?@DanHulme这只是一个例子;一般来说,我还对如何排除其他特征感兴趣。@ljedrz你在一生中遇到了什么问题?拥有
!Deref
无论如何都无法帮助您解决这些问题。对我来说,这种感觉像是XY问题。@ljedrz虽然这个答案谈到了
T
是一个参考,但我相信如果
T
包含一个参考,同样的情况也适用。Ie:
structS@WesleyWiser啊,我以为你的意思是这不适用于包含引用的对象。我同意这个结果(即嵌套引用也不起作用)。@ljedrz ewww。。。拉斯夫特!现在修好了,抱歉。整洁;因为我认为
auto
是为现有的
std
特征保留的,所以我试图用
Deref
解决一些问题。这个解决方法可能会派上用场。当然,这是可能的。然而,这有什么意义呢?正如@Wesley Wiser所说,用户总是可以
struct SNote,即auto-trait解决方案也会拒绝任何“包含”引用的类型,例如
S@Shepmaster:我不能为包装引用的结构手动实现自动特征吗?
fn foo<T: 'static>(x: T) -> T {}