I don't agree, because we can try the two following programs, and one of them does not compile. It compiles with underscore.
1:
let x = String::new();
let _ = x;
println!("{}", x);
2: let x = String::new();
x;
println!("{}", x); // ERROR: Use of moved value x.
And this is why I said that let _ = x; is a no-op. :)