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