Re: Passing Temporaries to perform non const operations
On Apr 16, 9:03 am, Bart van Ingen Schenau
<Bart.van.Ingen.Sche...@ict.nl> wrote:
On Apr 15, 4:09 pm, joec...@gmail.com wrote:
Altering a temporary is perfectly legal, for example:
std::vector<int> vec(40);
std::vector<int>(4).swap(vec); //legal.
I am trying to get this same functionality, but within an
assignment operator, but can't seem to find a good way to
bind the temporary.
For example:
class Foo;
int main()
{
Foo f;
f = Foo(20);
}
#include <vector>
class Foo
{
public:
Foo(int size=0) { m_data.resize(size);}
// PROBLEM HERE. The temporary can't be bound to a reference to non-=
const
// But if this were 'const reference', the swap function could not be=
called using it.
void operator=(Foo& foo)
{
m_data.swap(foo.m_data);
}
std::vector<int> m_data;
};
The only work-around I could think of was this ugly code:
void operator=(const Foo& foo)
{
std::vector<T>* tmpVec = const_cast<std::vector<T>*>(foo.m_data);
This isn't legal. m_data isn't a pointer, and can't be
converted to one. Perhaps you meant to use '&', instead of '*',
in the above.
tmpVec->swap(m_data);
}
Any better suggestions?
As long as move semantics are not yet available, your best
option is to use pass-by-value and hope the compiler optimises
out any redundant temporaries.
void operator=(Foo foo)
{
m_data.swap(foo.m_data);
}
But that doesn't have the same semantics. For some reason
(obfuscation?), he wants the assignment operator to modify the
object on the right hand side of the assignment as well.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34