On Wed, 10 Mar 2010 17:16:11 -0500, Pelle Månsson
<pelle.mans...@gmail.com> wrote:
On 03/10/2010 10:14 PM, Steven Schveighoffer wrote:
I think this is fine as long as we don't take it to the extreme. That
is, I don't want to see this happening:
foo.prop1.prop2++;
is rewritten to
auto p1 = foo.prop1;
auto p2 = p1.prop2;
p2++;
p1.prop2 = p2;
foo.prop1 = p1;
I think one level of lowering is enough to handle the most common cases.
Of course, if a property returns an lvalue, then it should just work.
-Steve
Why would you not want that? That's exactly what should happen! Why not?
I'm sorry if I'm missing something obvious.
Hm... on second thought you are right. I meant to say something like this:
foo.prop1.prop2.bar();
should not be rewritten in a similar fashion. ++ or op= in most cases
should change the value of the property, but arbitrary functions are not
as obvious.
The other thing I don't like about this is it is difficult for the
compiler to determine what is considered an rvalue or lvalue. Consider
something like this:
struct S
{
int x;
int *y;
ref S opAssignOpBinary(string op)(int other) { mixin("*y " ~ op ~ "
other"); return this; }
}
I believe the compiler considers S an rvalue, but the operator for += will
work as if it was an lvalue. To do that whole property shell-game for
this will be a complete waste. It makes things like smart pointers
perform way worse than they should.
What may be a good-enough rule is that the property rewriting is done only
if the end property (the one being affected) is a pure value type, or a
builtin and the compiler can tell that the operation only affects that
property.
Without full code inspection, the "right" solution can't be had.
-Steve