Re: avoiding temporaries
Thank you all for your comments!
Vector& operator = (Vector v)
{
v.swap(*this);
return *this;
}
Isn't this a bit overkill for his class. A class which consists
of only basic types, and thus cannot possibly throw anything,
ever. In such cases, simply copying does the trick nicely.
In such cases, both "swap" and "copy" variants are overkills. Swap requires
the memory to be allocated outside the class (Vector would be another kind
of a smart pointer only) and the copy is expensive.
This was rather an artifical example. What I was looking for is whether
there
was an option or a proposal to avoid a temporary (and the copy)
in cases like Vector::operator=( Vector( a, b, c, d ) ) [1] when Vector
1) does not throw exceptions
2) has no subclasses
3) has no virtual functions
4) used storage is not allocated by new()
I was wondering if [1] could be translated to a some form of constructor or
operator= that would basically tell "construct new Vector from a, b, c, d at
the place of an existing object" (like Vector::operator=( a, b, c, d )). In
the general case, there would certainly be problems with inheritance and
exceptions but I believe they could be both solved (virtual ctors/assignment
operators analogous to the virtual destructors approach, exception safety
can be achieved by resorting to swap-based implementation).
-- Marek Vondrak
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]