digitalmars.D.bugs - lvalue array.length error
- akcom (21/21) Jan 30 2006 If this has already been reported, I sincerely apologize;
- Jarrett Billingsley (12/15) Jan 30 2006 At the very bottom of the "Properties" topic in the D spec, is this noti...
- akcom (2/28) Jan 30 2006 ah, my mistake, thank you very much
- Dave (22/45) Feb 01 2006 arr.length = arr.length + 1; // also legal
If this has already been reported, I sincerely apologize;
class Foo
{
int []arr;
this()
{
arr = new int[12];
}
void Bar()
{
arr.length++;
/+
int len;
len = arr.length;
arr.length = len+1;
+/
}
}
in Foo.Bar(), the arr.length++ statement raises the following error in
the compiler: "test.d(126): (this.arr).length is not an lvalue", but
when using the commented code, everything compiles just fine
Jan 30 2006
"akcom" <CppCoder gmail.com> wrote in message news:drmdtk$1j7u$1 digitaldaemon.com...in Foo.Bar(), the arr.length++ statement raises the following error in the compiler: "test.d(126): (this.arr).length is not an lvalue", but when using the commented code, everything compiles just fineAt the very bottom of the "Properties" topic in the D spec, is this notice: Note: Properties currently cannot be the lvalue of an op=, ++, or -- operator. This is because properties are treated like functions. So arr.length++ Would be like writing arr.length()++ Which doesn't make sense (it's a no-op). Instead, you can write arr.length = arr.length + 1
Jan 30 2006
Jarrett Billingsley wrote:"akcom" <CppCoder gmail.com> wrote in message news:drmdtk$1j7u$1 digitaldaemon.com...ah, my mistake, thank you very muchin Foo.Bar(), the arr.length++ statement raises the following error in the compiler: "test.d(126): (this.arr).length is not an lvalue", but when using the commented code, everything compiles just fineAt the very bottom of the "Properties" topic in the D spec, is this notice: Note: Properties currently cannot be the lvalue of an op=, ++, or -- operator. This is because properties are treated like functions. So arr.length++ Would be like writing arr.length()++ Which doesn't make sense (it's a no-op). Instead, you can write arr.length = arr.length + 1
Jan 30 2006
akcom wrote:
If this has already been reported, I sincerely apologize;
class Foo
{
int []arr;
this()
{
arr = new int[12];
}
void Bar()
{
arr.length++;
/+
int len;
len = arr.length;
arr.length = len+1;
+/
}
}
in Foo.Bar(), the arr.length++ statement raises the following error in
the compiler: "test.d(126): (this.arr).length is not an lvalue", but
when using the commented code, everything compiles just fine
arr.length = arr.length + 1; // also legal
That is by design, and I think the general feeling is that the current
semantics are correct because .length is not an lvalue - it's a property
- so the prohibition against pre/post increment/decrement operators
makes sense.
Take a look at the bottom of: http://digitalmars.com/d/property.html
It's also consistent with this:
import std.stdio;
void main()
{
C c = new C;
// c.i++; // Error
c.i = c.i + 1; // Ok
writefln(c.i);
}
class C
{
private int _i;
int i() { return _i; }
int i(int val) { return _i = val; }
}
Feb 01 2006









akcom <CppCoder gmail.com> 