opAssign and const?

Era Scarecrow rtcvb32 at yahoo.com
Fri May 4 13:47:07 PDT 2012


On Friday, 4 May 2012 at 20:35:57 UTC, Era Scarecrow wrote:

>  Well the result seems to be true enough.. It also seems to 
> work if both are const. Why didn't I consider that before? 
> Maybe it should be noted in the next TDPL book.

  As I look at my code I realize why now. Pointers and arrays... 
that's why...

test.d(16): Error: cannot implicitly convert expression (x2.y) of 
type const(int[]) to int[]

  Which is why I was trying to suggest the ref was const since I 
wasn't modifying and could ensure it (just copying between 
buffers) but the temporary I'm taking over.. So that doesn't work 
now.

  This means I'll likely need 2 copies of the ref; 1 const and 1 
non-const.

import std.stdio;
import std.conv;

struct X {
   int x;
   int[] y;

   this (int x1, int y1) {
     x = x1; y ~= y1;
   }

   //const here won't work.
   ref X opAssign(const X x2) {
     writeln("from temporary?");
     x=x2.x;
     y=x2.y; //breaks here
     return this;
   }

   ref X opAssign(ref const X x2) {
     writeln("copy specific values?");
     x=x2.x;
	y[]=x2.y[];
     return this;
   }
}

X fn() {
   return X(1,2);
}

void main()
{
   X x = X(3,4);
   X y = X(5,6);

   x = y;
   writeln("Should selectively copy (ref)- ", to!string(x));

   x = fn();
   writeln("should overwrite all - ", to!string(x));
}


More information about the Digitalmars-d-learn mailing list