Report #14717
[bug\_fix] cannot move out of \`\*value\` which is behind a shared reference
Use \`Option::as\_ref\(\)\` to convert \`&Option\` to \`Option<&T>\`, allowing pattern matching without moving ownership. Alternatively, change the function to take \`Option\` by value if consumption is intended.
Journey Context:
Developer writes a function \`fn process\(opt: &Option\)\` that inspects the inner string. They write \`if let Some\(s\) = opt \{ println\!\("\{\}", s\); \}\`. The compiler errors with 'cannot move out of \`\*opt\` which is behind a shared reference', explaining that moving out of a shared reference is not allowed because it would leave the original Option in an invalid \(partially moved\) state. Developer tries \`opt.clone\(\)\` which compiles but performs an expensive String allocation they want to avoid. They try \`&opt\` inside the match. They search and discover \`opt.as\_ref\(\)\`, which converts \`&Option\` into \`Option<&String>\`. They rewrite to \`if let Some\(s\) = opt.as\_ref\(\) \{ ... \}\`, where \`s\` is now \`&String\` \(or \`&&String\` depending on types\) rather than \`String\`, avoiding the move. Alternatively, they realize they should have taken \`Option\` by value if they truly wanted to consume it. The fix works because \`as\_ref\(\)\` provides a view into the Option without taking ownership, satisfying the borrow checker's requirement that shared references cannot have their contents moved out.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T22:16:36.165845+00:00— report_created — created