cast(A)b is not an lvalue

monarch_dodra monarchdodra at gmail.com
Wed Dec 26 11:45:37 PST 2012


On Wednesday, 26 December 2012 at 17:13:14 UTC, Ali Çehreli wrote:
> On 12/26/2012 09:05 AM, Namespace wrote:
>>> I can answer the question in the subject line without looking 
>>> at
>>> dpaste: Yes, in many cases the result of a cast operation is 
>>> an
>>> rvalue. It is a temporary that is constructed at the spot for 
>>> that
>>> cast operation.
>>>
>>> Imagine casting an int to a double. The four bytes of the int 
>>> is
>>> nowhere close to what the bit representation of a double is, 
>>> so a
>>> double is made at the spot.
>>>
>>> Ali
>>
>> My question is: Should not work all three?
>> IMO: yes.
>
> Here is the code:
>
> import std.stdio;
>
> static if (!is(typeof(writeln)))
> 	alias writefln writeln;
>
> class A { }
> class B : A { }
>
> void foo(ref A a) { }
>
> void main()
> {
> 	A a = new A();
> 	A ab = new B();
> 	B b = new B();
> 	
> 	foo(a);
> 	foo(ab);
> 	foo(b); // < compile error
> }
>
> foo() takes a class _variable_ by reference (not a class 
> _object_ by reference). Since b is not an A variable, one is 
> constructed on the spot.
>
> Imagine foo() actually does what its signature suggest:
>
> void foo(ref A a) {
>     a = new B();
> }
>
> That line above is an attempt to modify the caller's rvalue.
>
> Ali

The example is much better with a "new A();" actually ;)

//----
class A { }
class B : A
{
     void B_method();
}

void foo(ref A a)
{
     a = new A();
}

void main()
{
     B b = new B();
     foo(b);//so now after this, b holds a A object? That would be 
catastrophic...
     b.B_method(); //Awwww crap...
}


More information about the Digitalmars-d-learn mailing list