Re: user-defined op= for type with reference member
On 2010-06-11 11:21:09 -1000, Paul Bibbings said:
Since I have used the following in another post, can someone just
confirm (or otherwise) whether the following definition of a
user-defined op= for a type with a reference member is well defined?
class AType
{
public:
AType(int& i)
: i_(i)
{ }
// ...
AType& operator=(const AType& other)
{
if (this != &other)
{
this->~Atype();
new (this) AType(other);
}
return *this;
}
private:
int& i_;
};
According to my reading of the example given in [basic.life] ?3.8/7 I
believe that it is, in this instance (since the constructor doesn't
throw, except on bad_alloc).
Yes, it's well-defined, but it's a really bad idea:
class BType : public AType
{
public:
BType& operator=(const BType& other)
{
return AType::operator==(other);
}
};
BType b1, b2;
b2 = b1; // nasty
In this particular example, there's almost certainly no nasty behavior.
But add a virtual function to AType (and make AType's destructor
virtual) and override the function in BType.
AType *at = &b2;
at->virtual_function();
Now things are messy, because the code says that b2 has type BType, but
BType's constructor has not been called.
--
Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com) Author of "The
Standard C++ Library Extensions: a Tutorial and Reference
(www.petebecker.com/tr1book)