Чтобы расширить комментарий @ ildjarn, семантика глобального встроенного =
установлена повсеместно; он вызывается при инициализации нового экземпляра класса с некоторым значением rvalue и вызывает соответствующий конструктор (основанный на типе значения r во время компиляции), который является хорошим способом обеспечения инициализации в стиле c вместо строго Требование инициализации всех переменных путем явного вызова конструктора. Перегрузка глобального оператора изменила бы слишком большую семантику языка, в то же время предоставив мало реальной информации о преимуществах - вы бы в корне изменили, как, какие и как называются конструкторы, и если вы чувствуете, что у вас есть причина сделать это через перегрузку глобальной =
, есть большая вероятность, что вы ошибаетесь.
Элемент класса operator=
перегружен, потому что он работает с уже существующим и инициализированным lvalue своего класса, и есть очевидные случаи, когда вы хотели бы иметь пользовательское поведение при изменении существующего объекта (например, только копирование определенных членов из значения r при пересчете других и оставлении одних в покое, или при правильном использовании ресурсов, удерживаемых указателем, для захвата нового ресурса без утечки памяти).
Там, где элемент operator=
имеет дело с полным объектом lvalue, встроенная система начинается только с блока памяти соответствующего размера и значения. Конструкторы всех форм и форм - это предоставляемые языком интерфейсы для изменения поведения встроенного =
без передачи вам контроля над самими семантиками. Мне было бы интересно посмотреть, что вы чувствуете вам нужно выполнить перегрузку глобального =
, что нельзя сделать с помощью конструктора.