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 :)

Reply via email to