lvalue method
Lars T. Kyllingstad
public at kyllingen.NOSPAMnet
Fri Oct 8 02:13:00 PDT 2010
On Fri, 08 Oct 2010 09:33:22 +0200, Benjamin Thaut wrote:
> Hi, I'm writing a vec4 math struct and I have a method of which the
> return value has to be a lvalue so I wonder which is the correct way to
> do this:
>
> vec4 Normalize() const { ... } //won't work, not a lvalue
>
> ref vec4 Normalize() const {
> vec4 temp;
> ...
> return temp;
> } //will this lead to a segfault or not?
The compiler shouldn't even accept this. When I try a similar thing, DMD
says "Error: escaping reference to local variable temp".
> ref vec4 Normalize() const {
> vec4* temp = new vec4;
> ...
> return *temp;
> } //ugly, don't want to allocate anything on the heap
This would work, since the variable is no longer on the stack and thus
survives the return of the function.
> auto ref vec4 Normalize() const {
> vec4 temp;
> ...
> return temp;
> } //will this lead to a segfault?
Well, that should compile, but it doesn't work the way you want. 'auto
ref' means that the function returns by ref if the return expression is
an lvalue *and it would not be a reference to a local or a parameter*.
So for this example, your function would return by value, not by ref.
> Or do I need to do it totaly in some other way?
Yes, you do. :) You are trying to create a variable on the stack, and
return it by reference. The problem is that when the function returns,
its stack frame (the memory occupied by the function's local variables)
is "released". At that point the variable doesn't exist anymore, and any
reference to it would be invalid.
-Lars
More information about the Digitalmars-d-learn
mailing list