|
|
|
|
|
by wtetzner
2687 days ago
|
|
OK, so the issue is that references aren't updated when a move occurs. That does make sense. So to make this work, references would need to be re-written when a move/copy occurs. I can still see having an easy way to construct self-referential structs being a useful thing, even if the compiler prevents you from moving them. Maybe with a smart clone() method that can update references correctly. However, I am a little confused about this specific example. I don't understand why oh_no() taking ownership causes f to be copied to a new location. Shouldn't it remain in the same place on the stack? I feel like I'm missing something. |
|
Yes! C++ has a concept called "move constructors" that allows for this (this would be that "smart clone" you talk about later in the comment), but we made a decision to not include it. This introduces some nice properties, at the cost of disallowing self-referencing structs.
> I can still see having an easy way to construct self-referential structs being a useful thing, even if the compiler prevents you from moving them.
So, in some sense, this is what the new Pin stuff is about. It lets you say "from this point on, this thing isn't going to move again" and therefore be self-referential.
> I don't understand why oh_no() taking ownership causes f to be copied to a new location.
"Taking owernship" means "move". "move" means "a memcpy from the old to the new location." Rust isn't really special from any other sort of language with value semantics here, other than disallowing you to use the old value, since it was moved out from. Does that make sense?