On Tue, 10 Jul 2018 at 15:23, Jonathan M Davis via Digitalmars-d
<digitalmars-d@puremagic.com> wrote:
>
> On Tuesday, 10 July 2018 14:58:09 MDT Manu via Digitalmars-d wrote:
> > 2. It looks like copy constructors are used to perform assignments
> > (and not constructions)... but, there is also opAssign. What gives?
> >     Eg:
> >       S b = a; // <- copy construction? looks like an assignment.
> >     And not:
> >       S b = S(a); // <- actually looks like a construction, but this
> > syntax seems to not be intended (and rightly so, it's pretty terrible)
>
> S b = a;
>
> has never been assignment in either C++ or D. It's initialization /
> construction, which means that it calls a constructor - be that a postblit
> constructor or a copy constructor. Assignment only occurs when you're giving
> an existing object a new value.

I know this, but it's not syntactically obvious, it just depends on
the fact that you already know that fact... I feel a DIP about copy
construction needs to have some text explaining that, and where the
edges are.
Is an initialisation assignment can use a copy constructor, why can't
a normal assignment implicitly use a copy constructor? (implicit
destruct then copy-construct)

> And why would
>
> S b = S(a);
>
> not be intended? Sure, it's kind of pointless if a is an S, but if you have
> a copy constructor, it makes perfect sense that S(a) would work and would be
> pretty bizarre if it didn't, since it's explicitly calling the copy
> constructor.

But there's a super explicit `@implicit` thing written right there...
so should we expect that an *explicit* call to the copy constructor is
not allowed? Or maybe it is allowed and `@implicit` is a lie?

> It even works right now if you give S a constructor that takes
> an S. It just isn't actually treated as a proper copy constructor at the
> moment, since that's currently the postblit constructor's job.

Current language doesn't have `@implicit` written anywhere...

Reply via email to