Copying reference types by value

Ali Çehreli acehreli at yahoo.com
Thu Apr 18 18:17:02 PDT 2013


On 04/18/2013 06:22 AM, Joseph Rushton Wakeling wrote:> On 04/17/2013 
10:29 PM, Ali Çehreli wrote:
 >> Yes but as I said I am not sure how useful or needed this whole 
thing is.
 >>
 >> The language handles copy, move, and assignment for structs. 
takeOver() seems to
 >> be a primitive operation for classes.
 >
 > Could you expand a bit on that?  Just that I'm not sure I understand your
 > meaning completely, and I'm curious. :-)

Being value types, structs enjoy automatic handling of copy, assignment, 
and in the case of rvalues, move.

struct S
{
     int i;
}

S makeS()
{
     return S();
}

void main()
{
     auto a = S();
     auto b = a;    // a is copied to b
     b = a;         // a is assigned to b
     b = makeS();   // the returned rvalue is 'moved' to b
}

Of course that works only for structs with simple value members. When 
the automatic handling is not sufficient or does the wrong thing, then 
the programmer must provide this(this), opAssign(), or ~this(). Things 
get more interesting when the members are mutable or immutable references.

With the above definition of S, all of the following compile:

     immutable(S) imm0;
     S mut = imm0;            // immutable to mutable

     immutable(S) imm1 = mut;  // mutable to immutable

     immutable(S) imm2 = imm0; // immutable to immutable

Now naively add another member to S:

struct S
{
     int i;
     int[] arr;  // <-- added
}

Only the latter of the three assignments compile:

     immutable(S) imm0;
     S mut = imm0;             // compilation ERROR

     immutable(S) imm1 = mut;  // compilation ERROR

     immutable(S) imm2 = imm0; // compiles

Anyway... I am trying to wrap up what I have learned so far before going 
any further. :)

For classes, none of these operations make sense: There is no automatic 
copying, no automatic assignment, nor there are rvalues to move.

 > I'd assumed this problem would be some fairly straightforward aspect 
of the
 > language that I just wasn't familiar with, so I'm quite struck by the 
fact that
 > it actually seems a non-trivial problem.

My experience has been with C++ so I don't know how this is solved in 
Java or C#. Maybe this is not a problem with the common idioms in those 
languages, which would also mean that this is not a problem with D 
classes. Rather, if one has decided to go with a class, then value 
semantics were not a consideration to begin with.

Ali



More information about the Digitalmars-d-learn mailing list