still confused about call by reference

Nathan Reed nathaniel.reed at gmail.com
Sun Oct 28 23:58:20 PDT 2007


Hoenir wrote:
> I'm still a bit confused about call by reference. When do I have to 
> explicitly use the & operator and when to use in, out and inout?
> I want to convert my C++ vector struct to D:
> 
> struct vec3
> {
>     vec3 operator+(const vec3& v) const
>     {return vec3(x+v.x, y+v.y, z+v.z);}
>     vec3 operator-(const vec3& v) const
>     {return vec3(x-v.x, y-v.y, z-v.z);}
> 
> I'm also wondering about how to handle the constness.
> Thanks in advance for any help :)

In C++, const references are used to signal the data is not changed by 
the function, and is passed by reference purely for efficiency's sake. 
I believe the correct D equivalent is 'in'.  The D spec states that 'in' 
is equivalent to 'final const scope', which means writing to the 
parameter is prevented, as in C++.

The spec does not say whether 'in' results in pass-by-reference or not, 
but in this case, I believe that is a decision that should be made by 
the compiler, not the programmer.

C++ non-const references are used to signal out-parameters, so the D 
equivalent would be out or inout, depending on whether your function 
wants to use the value that is passed in or not - 'out' parameters are 
initialized to their type's default value when the function begins, so 
any value that was there when the function was called gets clobbered, 
while 'inout' parameters let you read the original value.

Honestly, I'm not entirely sure what D's 'ref' parameter-storage class 
is for, since AFAICT all the uses of pass-by-reference are covered by 
in, out, and inout.

Thanks,
Nathan Reed


More information about the Digitalmars-d-learn mailing list