The goal is to have a member variable that 'acts like' a member variable of type T, but when read or written from, arbitrary code is run.
Ideally the arbitrary code will be syntactically easy to deal with.
C++ doesn't support this perfectly. It can get pretty close if you pretend your class has a pointer-to-data instead of instance-of-data in the syntactic sugar sense (ie, require *foo.bar += 7 instead of foo.bar += 7), as that gives you consistent operator-> behaviour.
Hmm.
What if the pattern we followed was that of an iterator, but we didn't have operator++ and the like.
There still is the problem of dealing with the copy constructor of the class that owns us. Ie:
struct A { Property<int> foo:};int main(int, char const*const*) { A a; A b; a = b; a.foo = 6;}
Operator= on Property<int> has to behave very non-iterator/pointer like -- more like a reference.
Even then, you can imagine a Property with a 'back end' store ending up behaving very badly. This is an artefact of mixing reference (which the Property has) and pointer (which the 'back end' store might have) in the same class, and it causing very unexpected behaviour.