Date: Fri, 24 Nov 2023 10:24:45 +0100
Hello, I have a question regarding implicit lifetimes and
copy-constructors, maybe someone can help me.
Consider following example
copy-constructors, maybe someone can help me.
Consider following example
---- struct buff_int{ unsigned char buffer[sizeof(int)]; buff_int(int i){ std::memcpy(buffer, &i, sizeof(int)); } int get_int() const { int* j = std::launder(reinterpret_cast<int*>(buffer)); return *j; } }; auto val = buff_int(42); int i = val.get_int(); ---- As far as I can see, everything is well-defined. std::memcpy creates implicitly an int object, and before accessing it, I'm using std::launder. But what about ---- struct buff_int{ /* as before */ }; auto val = buff_int(42); int i = val.get_int(); auto val2 = val; int i2 = val.get_int(); ---- Is the line "int i2 = val.get_int();" well-defined? AFAIK the copy constructor does not necessarily call std::memcpy, so it does not seem defined that the buffer in val2 has an int object with implicit lifetime contained in the buffer. A similar question holds for the assignment operator. As assignment does not necessarily use memcpy, it does not seem to end and/or begin an implicit lifetime, thus ---- struct buff_int{ /* as before */ }; auto val = buff_int(42); int i = val.get_int(); auto val2 = buff_int(-1); val = val2; int i2 = val.get_int(); ---- also seems to be UB. Thus to avoid UB/for having value semantic, the structure "buff_int" needs user-defined copy-constructor and assignment operator that uses memcpy internally, is that correct?
Received on 2023-11-24 09:24:51