Copy Constructor DIP

RazvanN razvan.nitu1305 at gmail.com
Fri Jul 13 11:02:57 UTC 2018


>> In a post-blit world, with no opAssign specified, postblit 
>> will call
>> for copy construction AND for assignment, thereby assignment 
>> is always
>> correct.
>> Once postblit is swapped for a copy-constructor, absence of 
>> opAssign
>> will result in invalid behaviour on assignment.

Indeed, but this was the source of the problem also, because you 
could
modify immutable fields that way.

>> Introduction of copy constructor breaks default assignment, it 
>> needs
>> to address it somehow. I think my suggestion is the only 
>> practical
>> solution.
>
> Affirmative. The DIP needs to specify how assignment is handled 
> if no opAssign is present but a copy ctor is present. Thanks!

The difference between a copy constructor and opAssign is how the 
type checking
is performed. This leads to situations where a copy constructor 
is not suitable as an assignment operator. However, if a copy 
constructor is defined in a way that is correctly type checked 
both as a constructor and as a normal function, then there is no 
problem in using the copy constructor for assignments:

struct A
{
     immutable int b;
     int c;
     @implicit this(ref A rhs)
     {
         this.c = rhs.c;
     }
}

struct B
{
     immutable int b;
     int c;
     @implicit this(ref A rhs)
     {
         this.b = rhs.b;
         this.c = rhs.c;
     }
}

void main()
{
     A a, c;
     A b = a;
     b = c;       // no problem in calling copy constructor, 
immutable is
                  // not modified
     B d, e;
     B f = d;
     f = d;       // cannot use copy constructor because it will 
modify immutable
                  // field B.b; for this situation you need an 
opAssign to specify
                  // how the assignment is dealt with.
}

The problem with this approach is that some copy constructors 
will also be used as assignment operators while others will not, 
but with good error messages it could be handled (error on line 
`f = d` : opAssign not specified and the copy constructor is not 
suitable for assignments because it modifies immutable field `b`).

What are your opinions on this?


More information about the Digitalmars-d mailing list