
A.X() = B.X() = 5 isn't horrible, but A.X = B.X = 5 is what one expects when one thinks of "properties."
Sorry, if I jump in in the middle of the discussion. Boost.Test uses properties with syntax like this: int i = a.p_X; a.p_X.value = 1; This syntax IMO has couple advantages: 1. From encapsulation standpoint this is as good as having explicit setter and getter. 2. I do not like to allow a.p_X = 1. ".value" syntax allows me to grep easily for all the encounters of property modification. This is especially useful in situations where there are myriads of read-only access and only couple mutating ones. 3. Single line definition: readwrite_property<int> p_X; Instead of 3 lines required by data member, getter and setter. 4. I also have readonly_property, which can restrict mutating access to the property value for all classes (in which case property initialized in a constructor once and never changes). Or I can have readonly property with fixed list of classes allowed mutating access. Gennadiy