Value type, ref type, how about something in between?

Ary Borenszweig ary at esperanto.org.ar
Sat Jul 4 18:34:24 PDT 2009


The Anh Tran escribió:
>   According to D spec,
>     structs, unions are value types.
>     classes are ref types.
> 
>   But this world is not perfectly described by the above 2. There are 4 
> cases:
> 
>   1. Value storage class inside value type.
>       class C {};
>       struct S {};
> 
>       struct Outer
>       {
>          C cc; // ref storage for ref type. This is the rescue for 
> splitting copy problem. D language's creators wanted this behavior. If
>          S ss; // value storage for value type. OK.
> 
>          void funcC(C c) {} // ref param. Correction for splitting copy.
>          void funcS(S s) {} // value param. OK.
>       }
> 
>   2. Value storage class inside ref type.
>       class Outer
>       {
>          C cc; // ref storage. Correction for splitting copy.
>          S ss; // value storage. OK.
> 
>          void funcC(C c) {} // ref param. Correction for splitting copy.
>          void funcS(S s) {} // value param. OK.
>       }
> 
>   3. Ref storage class inside a ref type.
>       class Outer
>       {
>          C cc; // ref storage for ref type. OK.
>          S ss; // How? Wanted ref, but value storage here
> 
>          void funcC(C c) {} // ref param. OK.
>          void funcS(ref S s) {} // ref param for value type. OK.
>       }
> 
>   4. Ref storage class inside value type.
>       struct Outer
>       {
>          C c; // ref storage for ref type. OK.
>          S s; // How? Wanted ref, but value storage here
> 
>          void funcC(C c) {} // ref param. OK.
>          void funcS(ref S s) {} // ref param for value type. OK.
>       }
> 
>   I can solve case 3+4 by wrapping struct S inside a class template. But 
> can we have a nicer / straightforward syntax?
>   Is there any problem that prevent ref storage class declaration for 
> struct types, sir?

Isn't pointers for that?

3.

class Outer {

   S* ss; // Wanted ref, got ref.

}

4.

structOuter {

   S* s; // Wanted ref, got ref.

}

Best regards,
Ary



More information about the Digitalmars-d mailing list