Здравствуйте, Marty, Вы писали:
S>>Значит и вы, и ваши пользователи должны страдать, ибо нарушается принцип наименьшего удивления.
M>И в чем же нарушение?
В том, что после того, как вы нашли объект в контейнере и делаете что-то с этим самым объектом (не с контейнером, и не с ключом объекта), то у вас меняется видимое пользователю содержимое объекта.
Т.е. вполне можно понять, когда сам по себе operator[] для map может изменить порядок следования (скажем, если operator[] обновляет "метку времени" последнего обращения к объекту). Но когда это делает не operator[], а последующие действия с самим объектом, то это из категории "внезапно".
Кроме того, как я понимаю, у вас вот такая ситуация:
struct A {
int _a;
long _b;
};
Marty::TrickyMap<int, A> map;
...
map[ 0 ] = A{ ._a = 3, ._b = 4 };
будет менять порядок следования элементов, т.к. вы видите полную замену содержимого. Но вот так:
map[ 0 ]->_a = 3;
map[ 0 ]->_b = 4;
порядок следования уже не поменяется. Хотя объект полностью изменит свое содержимое.
M>Да, это выглядит интересно. А как такая конструкция называется, и в каких разделах описана?
https://en.cppreference.com/w/cpp/language/member_functions.html -- в разделе Member functions with ref-qualifier