Why isn't `std::mem::drop` exactly the same as the closure |_|() in higher-ranked trait bounds? : <p>The implementation of <a href="https://doc.rust-lang.org/std/mem/fn.drop.html" rel="noreferrer"><code>std::mem::drop</code></a> is documented to be the following:</p>

<pre class="lang-rust prettyprint-override"><code>pub fn drop&lt;T&gt;(_x: T) { }
</code></pre>

<p>As such, I would expect the closure <code>|_| ()</code> (colloquially known as the <a href="https://enet4.github.io/rust-tropes/#toilet-closure" rel="noreferrer">toilet closure</a>) to be a potential 1:1 replacement to <code>drop</code>, in both directions. However, the code below shows that <code>drop</code> isn't compatible with a higher ranked trait bound on the function's parameter, whereas the toilet closure is.</p>

<pre class="lang-rust prettyprint-override"><code>fn foo&lt;F, T&gt;(f: F, x: T)
where
    for&lt;'a&gt; F: FnOnce(&amp;'a T),
{
    dbg!(f(&amp;x));
}

fn main() {
    foo(|_| (), "toilet closure"); // this compiles
    foo(drop, "drop"); // this does not!
}
</code></pre>

<p>The compiler's error message:</p>

<pre class="lang-none prettyprint-override"><code>error[E0631]: type mismatch in function arguments
  --&gt; src/main.rs:10:5
   |
1  | fn foo&lt;F, T&gt;(f: F, x: T)
   |    ---
2  | where
3  |     for&lt;'a&gt; F: FnOnce(&amp;'a T),
   |                ------------- required by this bound in `foo`
...
10 |     foo(drop, "drop"); // this does not!
   |     ^^^
   |     |
   |     expected signature of `for&lt;'a&gt; fn(&amp;'a _) -&gt; _`
   |     found signature of `fn(_) -&gt; _`

error[E0271]: type mismatch resolving `for&lt;'a&gt; &lt;fn(_) {std::mem::drop::&lt;_&gt;} as std::ops::FnOnce&lt;(&amp;'a _,)&gt;&gt;::Output == ()`
  --&gt; src/main.rs:10:5
   |
1  | fn foo&lt;F, T&gt;(f: F, x: T)
   |    ---
2  | where
3  |     for&lt;'a&gt; F: FnOnce(&amp;'a T),
   |                ------------- required by this bound in `foo`
...
10 |     foo(drop, "drop"); // this does not!
   |     ^^^ expected bound lifetime parameter 'a, found concrete lifetime
</code></pre>

<p>Considering that <code>drop</code> is supposedly generic with respect to any sized <code>T</code>, it sounds unreasonable that the "more generic" signature <code>fn(_) -&gt; _</code> is not compatible with <code>for&lt;'a&gt; fn (&amp;'a _) -&gt; _</code>. Why is the compiler not admitting the signature of <code>drop</code> here, and what makes it different when the toilet closure is placed in its stead?</p>
