Property assignment problem
SebastianA
sebastian.ahlman at remedygames.com
Fri May 11 00:10:37 PDT 2012
On Friday, 11 May 2012 at 07:03:10 UTC, Jonathan M Davis wrote:
> On Friday, May 11, 2012 08:52:14 SebastianA wrote:
>> This is related to this thread:
>> http://forum.dlang.org/thread/cnwpmhihmckpjhlaszzy@forum.dlang.org
>>
>> I am posting it here as well, since it no longer concerns only
>> GDC. Also, I am not sure if this is a bug or intended
>> behaviour.
>> Consider the following code:
>>
>> ====
>> void runTest()
>> {
>> Thing t;
>> t.vPosition = (Clock.currStdTime % 2 == 0) ? Vec(2, 2) :
>> Vec(3,
>> 3);
>> Vec v = t.vPosition;
>>
>> writefln("%d %d\n", v.x, v.y);
>> }
>>
>> struct Vec
>> {
>> int x;
>> int y;
>> }
>>
>> struct Thing
>> {
>> @property Vec vPosition() { return mPosition; }
>> @property Vec vPosition( const ref Vec value ) { return
>> mPosition = value; }
>>
>> private:
>> Vec mPosition;
>> }
>> ====
>>
>> The line that sets the value of the vPosition property does not
>> compile on DMD. Instead it gives the error "Error: not a
>> property
>> t.vPosition". On GDC this compiles but it does not work in
>> release mode, only in debug mode. In release mode it sets the
>> property to 0 0. If I assign the vector to a temp variable
>> before
>> assigning it to the position it works. It also works if I
>> replace
>> the time expression with a constant like "true" or some other
>> value known at compile time.
>>
>> Is this a bug or is it supposed to refuse to compile the code?
>> Also, why does it compile on GDC?
>
> Remove the ref from the setter. Either that or duplicate it:
>
> @property Vec vPosition( const Vec value )
> { return mPosition = value; }
> @property Vec vPosition( const ref Vec value )
> { return mPosition = value; }
>
> ref does not currently accept rvalues, even if it's const
> (unlike C++). There
> are issues in C++ caused by the fact that const& parameters can
> be either
> lvalues or rvalues, so D insists that ref is always an lvalue,
> even if it's
> const. There has been some discussion of making it possible for
> ref and const
> ref to take rvalues with some set of restrictions to avoid the
> problems that
> it causes in C++, but that hasn't been fully sorted out yet.
>
> - Jonathan M Davis
Okay, thanks for the info. The weird thing is, if I change the
line to:
t.vPosition = Vec(2, 2);
it compiles and works, even if the property is ref. As far as I
know, this does nothing towards correcting the rvalue issue.
Should this also cause an error?
More information about the Digitalmars-d
mailing list