구현은 std::mem::drop
다음과 같습니다.
pub fn drop<T>(_x: T) { }
따라서, 폐쇄 |_| ()
( 구체적 으로 화장실 폐쇄 라고도 함 )가 drop
양방향으로 잠재적으로 1 : 1로 대체 될 것으로 기대합니다 . 그러나 아래 코드 drop
는 화장실 변수가 변하는 반면 함수의 매개 변수에 더 높은 순위의 특성과 호환되지 않음을 보여줍니다 .
fn foo<F, T>(f: F, x: T)
where
for<'a> F: FnOnce(&'a T),
{
dbg!(f(&x));
}
fn main() {
foo(|_| (), "toilet closure"); // this compiles
foo(drop, "drop"); // this does not!
}
컴파일러의 오류 메시지 :
error[E0631]: type mismatch in function arguments
--> src/main.rs:10:5
|
1 | fn foo<F, T>(f: F, x: T)
| ---
2 | where
3 | for<'a> F: FnOnce(&'a T),
| ------------- required by this bound in `foo`
...
10 | foo(drop, "drop"); // this does not!
| ^^^
| |
| expected signature of `for<'a> fn(&'a _) -> _`
| found signature of `fn(_) -> _`
error[E0271]: type mismatch resolving `for<'a> <fn(_) {std::mem::drop::<_>} as std::ops::FnOnce<(&'a _,)>>::Output == ()`
--> src/main.rs:10:5
|
1 | fn foo<F, T>(f: F, x: T)
| ---
2 | where
3 | for<'a> F: FnOnce(&'a T),
| ------------- required by this bound in `foo`
...
10 | foo(drop, "drop"); // this does not!
| ^^^ expected bound lifetime parameter 'a, found concrete lifetime
즉 고려 drop
어떤 크기에 대한 가정 제네릭 T
, 그것은 "더 일반적인"서명이 있다는 불합리한 소리 fn(_) -> _
와 호환되지 않습니다 for<'a> fn (&'a _) -> _
. 컴파일러가 drop
여기 서명을 인정하지 않는 이유는 무엇입니까? 변기 덮개를 대신 사용하면 어떻게 달라 집니까?