Re: assignment operator for classes with const data
LR wrote:
Gavin Deane wrote:
LR wrote:
scroopy wrote:
Is it impossible in C++ to create an assignment operator for classes
with const data?
<snip>
Have you looked into const_cast?
I don't see how that will help in the OP's case. const_cast can't be
used to change an object that was declared const.
You snipped this:
"You may also find this of interest: http://www.gotw.ca/gotw/059.htm "
I snipped it because, informative though it is, I thought it was an
aside and not directly relevant to your sugestion to look at
const_cast.
The OPs assignment operator is a little unusual in that he's not
returning a reference,
I hadn't picked up on that, but I don't think it's relevant to the
const question.
however, I saw nothing in the OP that suggested
that a copy ctor and swap couldn't be added to this class, and using
form described in the link above...
MyClass &operator=(const MyClass &m) {
MyClass temp(m);
swap(temp);
return *this;
}
Implementing the copy ctor should be easy. MyClass::swap(MyClass &) has
the problem described by the title of the thread, hence my suggestion to
look into const_cast.
MyClass::swap(MyClass &) is no more allowed or able to change the const
data member than the OP's flawed assignment operator is.
However, suppose that the op really does want something like (sorry,
typed in not cut and pasted)
class X {
const int m_;
public:
X operator=(const X &x) {
m_ = x.m_;
}
};
which won't work.
Instead, perhaps
class X {
const int m_;
public:
X operator=(const X &x) {
int &r = const_cast<int&>(m_);
r = x.m_; // BANG!!!!! Undefined behaviour
}
};
I'm not 100% certain if this complies with the standard, however, it
seems to compile with no errors or warnings with Comeau's try it out,
Really? I get two warnings (no errors) from Comeau. One warns that no
constructor is defined that initialises the const member and the other
warns that there is no return statement in the assignment operator. But
compiling isn't the main issue with the code above. I've indicated with
a comment - the code exhibits undefined behaviour when it attempts to
modify the const object m_.
doesn't get a warning from Gimpel's Blank Slate, except that we're
returning an X instead of a X&, and compiles and runs with the compiler
I normally use.
And what does the code _do_ when it runs? The behaviour is undefined so
anything is possible. Change the compiler settings, change to a
different compiler, change to a different version of the same compiler,
change the phase of the moon and the behaviour could change. If you
happened to see the behaviour you expected you were just unlucky.
Of course these last three cannot be taken as proof
that it is compliant. And it would certainly deserve some sort of
comment if put into production code.
Code that invokes undefined behaviour should not be allowed in
production code.
My compiler will compile this too:
class X {
const int m_;
public:
X operator=(const X &x) {
const_cast<int&>(m_) = x.m_;
Exactly the same problem. m_ is const. No amount of casting to overrule
the compiler makes it possible to modify it's value in a defined way.
}
};
Gavin Deane