[fpc-devel] Operator overloading question: Impossible to overload assignment for equal types. Why?

Bart bartjunk64 at gmail.com
Wed Apr 24 11:59:26 CEST 2024


Hi,

Overloading the := (assignment) operator for equal types is forbidden.
Out of curiosity I would like to know why that is?

When you have e.g. a record definition containing a dynamic array, not
being able to overload the assignment operator is just a PITA.

OK, once you know why the assignment operator in such a case does not
do what you intuitively thought it would do, you just work around
this.

Just a simple example:

type
  TArr = array of integer;
  TRec = record
    A: TArr;
  end;

procedure DoItConst(const R: TRec);
var
  temp: TRec;
begin
  temp := R;
  temp.A[0] := 111;
end;

var
  R1, R2: TRec;

begin
  R1.A := [1,2,3];
  R2 := R1;
  R2.A[0] := 666;
  DoItConst(R2);
end.

After all this:
R1:
Length(R.A) = 3
  R.A[0] = 111
  R.A[1] = 2
  R.A[2] = 666

R2:
Length(R.A) = 3
  R.A[0] = 111
  R.A[1] = 2
  R.A[2] = 666

Yes: programmer error (PEBKAC).
(I once spent several hours to find out why my configuration got
changed after passing a property around to a procedure similar to
DoItConst ...)
So you write something like:

function AssignRec(Src: TRec): TRec;
begin
  Result.A := Copy(Src.A);
end;

And then call that in every place where you intuitively would have
used the assignment operator, and avoid code like in DoIt().

In such instances it would really be helpfull if you could just
overload the assignment operator like:
operator := (Src: TRec): TRec;
begin
  Result := AssignRec(Src);
end;


-- 
Bart


More information about the fpc-devel mailing list