1. As I said, the boundary for "cheap" depends on the context and one of the things that makes Rust special is that it aims to make costs explicit and make it difficult for you to fall off the fast path accidentally. I think, on those grounds, it would rely too much on the skill of third-party implementers of
CheapClone or whatever to fit the Rust philosophy.2. Historically, Rust has leaned toward seeing things which are too footgun-y as candidates for deprecation (eg. static mut), not introduction, and "cheap Rc-like" is not something the compiler can evaluate the truthfulness of. Again, it doesn't fit the Rust philosophy to decide at the declaration instead of the call site.
3. Deciding at the declaration instead of the call site bakes in a language-level assumption that people will be using an IDE, which Rust has avoided so far. (Partly because the better the non-IDE experience, the higher the ceiling for what improvements an IDE can bring.)
4. Why improve the ergonomics just for reference-counted pointers?
Hence my leaning on the side that, if we want this, it should be some caller-side thing, such as an equivalent to this, but something actually compatible with Rust's existing grammar:
thread.spawn(|| clone(ref_a, ref_b, non_ref_are_also_ok) {
// ...
});https://lobste.rs/c/sf2dyz