Re: std::vector and a bit-wise copy
Am 10.02.2011 00:24, schrieb Jeremy:
I have a question that I having trouble finding a straight answer to,
but thought it may be obvious to someone here.
If I have a struct with a vector as a member:
struct A
{
std::vector<int> theVec;
};
And I make two instances of that vector x and y and populate the
vector in x. Is it undefined behavior to then set y= x ?
No, this is a well-defined operation.
Such as
int main()
{
A x;
A y;
fill(x); // allocates the vector and populates it
y = x;
}
Seeing A has no copy-constructor declared, we should do a bit-wise
copy from x to y.
This is an incorrect assumption. Type A has an implicitly declared
copy-constructor and an implicitly defined copy-constructor will
be produced once it is odr-used. An implicitly-defined copy
constructor will invoke the copy constructor of all it's members
and sub-classes (As of C++0x, overload resolution will happen, but
this does not make a difference in this example). There is no
"bit-wise copy" in action here, not even for scalar types.
Since the vector in y has no memory allocated to it,
I'm assuming this should be just a case of memory trampling and
exhibit UB.
Is that wrong or am I missing something w.r.t. the bit-wise copy?
If some low-level operation (e.g. memcpy) would happen here,
this would indeed be a problem, but the language guarantees
that it does not happen here. Maybe you are mixing here two
different concepts? Some types are trivially copyable (e.g.
scalar types like int), where a specified usage of memcpy
and similar operations leads to well-defined results, but
the language doesn't say that the implicitly defined copy-
constructor does a memcpy operation.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]