On Thursday, 24 January 2013 at 22:04:02 UTC, Andrei Alexandrescu wrote:
Properties are DATA, well except when you need to pass fields by reference etc. at which point the syntactic glue comes unglued.

An enum or a literal can't be passed by reference or otherwise have the address taken either, but we don't argue about if they're data or not, and don't change barely related parts of the language over them.

void foo(ref int a) {}

int b;
foo(b); // ok
foo(10); // nope

test.d(6): Error: function test.foo (ref int a) is not callable using argument types (int)
test.d(6): Error: constant 10 is not an lvalue


No big deal. Similarly:

enum c = 20;
foo(c);

test.d(12): Error: function test.foo (ref int a) is not callable using argument types (int)
test.d(12): Error: constant 20 is not an lvalue


Note: the error message betrays some truth about enum's implementation.... but who cares.


And finally:

@property int bar() { return 0; }
foo(bar);

test.d(9): Error: function test.foo (ref int a) is not callable using argument types (int)
test.d(9): Error: bar() is not an lvalue



Like the enum, we see a hint in the error message that the compiler is doing a little magic... but who cares.

Reply via email to