cast(A)b is not an lvalue
monarch_dodra
monarchdodra at gmail.com
Wed Dec 26 11:49:36 PST 2012
On Wednesday, 26 December 2012 at 19:45:53 UTC, monarch_dodra
wrote:
> 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 ;)
Wait, never mind. Your example is better.
I actually fell in the "trap" thinking my variable got modified :)
More information about the Digitalmars-d-learn
mailing list