Недавно я недавно обнаружил, что сложные операторы присваивания (такие как operator+=
или operator-=
) могут быть перегружены вне класса.Почему перегруженные составные операторы присваивания являются функциями, не являющимися членами?
Рассмотрим:
class X { }; // A third party class
// The following function is legal:
X& operator+=(X& lhs, const X& rhs) {
// ...
}
Очевидно, что функция не-член не может касаться частного интерфейса X
, поэтому нет инкапсуляции беспокойства здесь. Но похоже, что это часть собственного интерфейса X
, чего явно нет.
Мне кажется, это может привести к серьезному злоупотреблению кодом и запутанному поведению. Представьте, что кто-то подумал, что было бы неплохо использовать его для некоторых «умных хаков» со стандартными, такими как std::vector
или std::map
.
Это особенно характерно, поскольку другие операторы, такие как operator[]
и operator->
, не могут быть функциями, не являющимися членами, что я и думал об этом.
Так почему же это разрешено?
Я не вижу никаких проблем. – Columbo