Какие операторы можно перегружать в C++? Можно ли создавать собственные (ранее не представленные) операторы?

В.Г. спрашивает: Подскажите, пожалуйста, как создать собственный оператор в С++? Через перегрузку операторов — не получилось. Пытался создать оператор :=.

Ответ: 

Здравствуйте. К сожалению, свои собственные операторы в C++ создавать нельзя, а можно только перегружать существующие (не все, но многие). Такое ограничение вызвано прежде всего тем, что синтаксический анализатор языка с созданием каждого нового оператора пришлось бы тоже учить как-то его распознавать (проверять корректность использования и т.д.).

Перечень операторов доступных для перегрузки:

+       -       *       /       %       ^       &       |
~       !       ,       >=      <=      >       <       =
++      --      <<      >>      ==      !=      &&      ||
+=      -=      /=      %=      ^=      &=      |=      *=
<<=     >>=     [ ]     ( )     ->      ->*     new     delete

Соответственно, даже среди существующих операторов есть такие, которые нельзя перегрузить. Например, оператор разрешения области видимости :: или оператор ., используемый для обращения к полям и методам объекта.

Отдельно хочется отметить, что перегрузка операторов не всегда является процедурой необходимой. Во многих современных языках такой возможности нет (например, в Java).

Во-первых, перегружая оператор можно наделить его не очевидным смыслом для всех прочих разработчиков, кроме автора программы. Например, логичным является перегрузка оператора + для класса строк (он может использоваться для склейки / объединения / конкатенации двух и более строк), но какой результат должен давать, например, оператор * примененный к двум строкам?

Во-вторых, перегрузка оператора в контексте конкретной задачи (конкретного класса) может получиться неоднозначной. Например, если для класса векторов мы перегружаем оператор *, то результатом должно быть векторное или скалярное произведение?