Jeremie Pelletier wrote:
Andrei Alexandrescu Wrote:
Jeremie Pelletier wrote:
Graham St Jack Wrote:
On Sun, 30 Aug 2009 21:28:18 -0400, Jeremie Pelletier wrote:
I agree that D lacks a mechanism to separate the object from it's
reference. Maybe syntax like the following could be used to
apply the storage class to the object value, and not the
reference value:
class Foo; void bar(in Foo& foo) {}
It's quite ugly and C-like, but that's the first thing that came
to mind. The reference value is unique to the current method and
shouldn't share the same storage qualifiers as it's referenced
memory.
I think the time for pining over this particular syntax feature of
D is over - as nice as it would be to be able to fix the problem in
the language, it would be too disruptive right now.
I think it would be better to fix it in D2 instead of patching a
language design flaw with a template. It wouldn't be the first time
D2 has changes that breaks existing code anyways (and the upcoming
T[new] will definitely break a lot of code, so does shared when it
works, etc), so it would be less disruptive to do it now than never
do it.
I agree with the sentiment. The issue is, however, that the change adds
a fair amount of complexity to the const system for an arguably
not-often-used need.
Andrei
Correct me if I'm wrong, but I don't see how complex that could be. I assume
the compiler already makes the difference between the reference value and the
referenced object, all that needs to be done is to reflect that view in the
syntax.
There was a lot of discussion around "head constness" and "tail
constness" a while ago in this newsgroup. The general sentiment was that
adding one or both of these nuances would make const too difficult to
bother with.
Maybe a .ref property?
class A {}
void foo(in A a) {
a = new A(); // fail, cannot modify const
a.ref = new A(); // ok, only reference value is modified
}
If you want to make the reference immutable, you can use the .ref on the class
identifier:
const(A.ref)[] AList; // slice of const references to A
It may not be perfect, but I do firmly believe that the D syntax needs a
mechanism to separate references from objects, even if rarely used, I can think
of at least 15-20 places in my code I had to use workarounds for such cases.
I don't think A* should be used since that is a pointer to an object reference, it
would break too much code and be incredibly hard to track back. A& looks nice
because that's how references are already handled in C++, and we'd get const(A)&
the same way we get const(int)*.
There would still be a problem with struct objects.
Andrei