www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - cast(A)b is not an lvalue

reply "Namespace" <rswhite4 googlemail.com> writes:
If I don't comment out line 19 I get:
/home/c803/c821.d(19): Error: function c821.foo (ref A a) is not 
callable using argument types (B)
/home/c803/c821.d(19): Error: cast(A)b is not an lvalue

Code: http://dpaste.dzfl.pl/89f55c62

Should not work all three?
Dec 26 2012
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 12/26/2012 07:37 AM, Namespace wrote:
 If I don't comment out line 19 I get:
 /home/c803/c821.d(19): Error: function c821.foo (ref A a) is not
 callable using argument types (B)
 /home/c803/c821.d(19): Error: cast(A)b is not an lvalue

 Code: http://dpaste.dzfl.pl/89f55c62

 Should not work all three?
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
Dec 26 2012
parent reply "Namespace" <rswhite4 googlemail.com> writes:
 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.
Dec 26 2012
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
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
Dec 26 2012
next sibling parent reply "monarch_dodra" <monarchdodra gmail.com> writes:
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... }
Dec 26 2012
parent "monarch_dodra" <monarchdodra gmail.com> writes:
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 :)
Dec 26 2012
prev sibling parent reply "Maxim Fomin" <maxim maxim-fomin.ru> writes:
On Wednesday, 26 December 2012 at 17:13:14 UTC, Ali Çehreli wrote:
 Here is the code:

 import std.stdio;

 static if (!is(typeof(writeln)))
 	alias writefln writeln;
What does this for? I constantly face in code samples shared in this NG.
Dec 26 2012
next sibling parent "Namespace" <rswhite4 googlemail.com> writes:
On Wednesday, 26 December 2012 at 19:52:21 UTC, Maxim Fomin wrote:
 On Wednesday, 26 December 2012 at 17:13:14 UTC, Ali Çehreli 
 wrote:
 Here is the code:

 import std.stdio;

 static if (!is(typeof(writeln)))
 	alias writefln writeln;
What does this for? I constantly face in code samples shared in this NG.
It's automatically generated from Dpaste templates. all: Thanks for the explanation.
Dec 26 2012
prev sibling parent Andrej Mitrovic <andrej.mitrovich gmail.com> writes:
On 12/26/12, Maxim Fomin <maxim maxim-fomin.ru> wrote:
 static if (!is(typeof(writeln)))
 	alias writefln writeln;
What does this for? I constantly face in code samples shared in this NG.
Probably for D1 compatibility. D1 didn't have writeln.
Dec 26 2012