On Fri, Feb 6, 2009 at 2:34 AM, Robert Jacques <sandf...@jhu.edu> wrote: > On Thu, 05 Feb 2009 06:55:46 -0500, Alex Burton <alex...@mac.com> wrote: > >> Hi, >> >> I just found a bug that comes out of the property syntax. >> >> The property syntax is great in that it allows a smooth transition from >> simple code dealing with public member variables to the use of interfaces >> without needing to update the client code. >> i.e. A.bob = 1 can stay as A.bob = 1 when bob changes from being an int to >> being void A::bob(int i) >> instead of changing to A.bob(1). >> >> But this can introduce the bug I show below. >> >> Proposal : >> If the temporary returned by the property syntax getter function is >> modified, then the corresponding setter function needs to be called with the >> temporary as argument. >> >> struct A >> { >> int i; >> int j; >> }; >> >> class B >> { >> A mA; >> public: >> A a() { return mA; } >> void a(Atom a) { mA = a; } >> }; >> >> >> int main() >> { >> B b; >> b.a.j = 10; // error b.a is a temporary. >> } > > This isn't a bug, it's a feature. What you wanted to use were ref returns > (see http://www.digitalmars.com/d/2.0/function.html ) > ref A a() { return mA; }
You could call it a bug that the compiler doesn't warn about the modification of a temporary like that in a way that has no side effects. Or maybe it does warn about it if you enable warnings? --bb