Re: user-defined op= for type with reference member
"James Kanze" <james.kanze@gmail.com> wrote in message
news:a28d1a29-e66b-4937-be0a-ff79dd639bdd@y4g2000yqy.googlegroups.com...
On Jun 11, 10:27 pm, "Leigh Johnston" <le...@i42.co.uk> wrote:
"Paul Bibbings" <paul.bibbi...@gmail.com> wrote in message
news:87iq5pe056.fsf@gmail.com...
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).
Attempting to use this trick to reseat a reference or
destruct/re-construct const members is UB IIRC, there was a
thread about this a few months ago I think.
It's not undefined behavior per se. The standard is quite
clear that it is defined, and what its semantics are.
Wrong, doing it is forbidden by the standard so doing it is undefined
behaviour:
[3.8/7]
"If, after the lifetime of an object has ended and before the storage which
the object occupied is reused or
released, a new object is created at the storage location which the original
object occupied, a pointer that
pointed to the original object, a reference that referred to the original
object, or the name of the original
object will automatically refer to the new object and, once the lifetime of
the new object has started, can
be used to manipulate the new object, if:
the type of the original object is not const-qualified, and, if a class
type, does not contain any non-static
data member whose type is >>>const-qualified<<< or a >>>reference type<<<,
and"
/Leigh