4 ms·
A language with copy constructors doesn't prevent you from putting a bug in them. C++ or Rust might have put a 0 in the uninitialized member, but the bug would
by bonzini 9y ago
A language with copy constructors doesn't prevent you from putting a bug in them.
C++ or Rust might have put a 0 in the uninitialized member, but the bug would have remained.
- steveklabnik 9y agoRust doens't have copy constructors, to be clear.
- masklinn 9y ago> A language with copy constructors doesn't prevent you from putting a bug in them. If you don't override it, it will copy everything properly. > Rust might have put a 0 in the uninitialized member Rust does not do that. If a member is not initialised, it's uninitialised and in this case the structure will be rejected. Here even if you could not just have derived Clone (struct bio looks non-trivial) your hand-rolled implementation would have complained that you had not properly initialised the member.
- bonzini 9y ago> If you don't override it, it will copy everything properly. Sure, so does memcpy or bare struct assignment in C. The problem is that trivial copy constructors are relatively rare. > Here even if you could not just have derived Clone (struct bio looks non-trivial) your hand-rolled implementation would have complained that you had not properly initialised the member. Right, but this is more similar to an assignment operator. DerefMut in Rust I think wouldn't have caught the bug.
- masklinn 9y ago> Right, but this is more similar to an assignment operator. Only if you don't zoom out. If you do, this is alloc/init/fill which in C++ or Rust would use a regular copy and RVO.