C++ Logo

std-proposals

Advanced search

Re: Default assignment operators from copy/move constructors

From: Walt Karas <wkaras_at_[hidden]>
Date: Thu, 6 Aug 2020 22:35:33 +0000 (UTC)
On Thursday, August 6, 2020, 4:25:11 PM CDT, Ville Voutilainen <ville.voutilainen_at_[hidden]> wrote: On Fri, 7 Aug 2020 at 00:19, Walt Karas via Std-Proposals<std-proposals_at_[hidden]> wrote:
>
> On Thursday, August 6, 2020, 3:57:11 PM CDT, Ville Voutilainen <ville.voutilainen_at_[hidden]> wrote:
>
> On Thu, 6 Aug 2020 at 23:49, Walt Karas via Std-Proposals
>
> <std-proposals_at_[hidden]> wrote:
> >
> > If a class C has a copy constructor, seems desirable to generate a default copy assign like:
> >
> >
> > C & operator = (C const &rhs)
> > {
> > if (this != &rhs)
> > {
> >
> > this->~C();
> > ::new (this) C(rhs);
> > }
> > return *this;
> > }
> >
> >
> > Likewise for default move assign when move copy is defined:
> >
> >
> > C & operator = (C &&rhs)
> >
> > {
> > if (this != &rhs)
> > {
> >
> > this->~C();
> > ::new (this) C(std::move(rhs));
> > }
> > return *this;
>
>
> Those definitions are not exception-safe, so I'd find it questionable
> to generate them by default.
>
> WK: Good point, they should be noexcept if the corresponding constructor is noexcept (and the destructor).


And if it isn't noexcept, what do you do?

WK: Under the current Standard, if a base or member assignment op is noexcept(false), isn't the default assignment op noexect(false)? That is what I'm thinking, noexcept is inferred for the default.

Received on 2020-08-06 17:39:03