ключевое слово static для объявлений бинарных операторов - PullRequest
8 голосов
/ 08 июня 2019

В C ++ бинарные операторы могут быть переопределены одним или двумя операторами, когда LHS является объявленным классом.Если объявлено с двумя параметрами, должно быть функцией, не являющейся членом.В этом коде два объявления идентичны.

class MyClass
{
     public:
         MyClass operator+(const MyClass&);
}
MyClass operator+(const MyClass&, const MyClass&);

Существует ли причина, по которой последнее не может быть выполнено как статическая функция-член?Например,

class MyClass
{
     public:
         static MyClass operator+(const MyClass&, const MyClass&);
}

Это упростит запись операторов ввода / вывода потока (я знаю, что вы можете использовать friend для объявления оператора)

1 Ответ

6 голосов
/ 08 июня 2019

Логика заключается в том, что a+b можно интерпретировать как operator+(a,b) или как a.operator+(b), каждый из которых выглядит правдоподобно, если вы щурились. Первый не может найти какие-либо функции-члены; последние могут находить статические, но бесполезно передавать им только b. Статический может быть вызван должным образом через интерпретацию как a.operator+(a,b), но это попытается передать дополнительный аргумент любому нестатическому члену (например, возможно, преобразовав унарный - в двоичный). Это также лишило бы возможности разрешать преобразования по первому аргументу, поскольку его (оригинальный) тип ограничивал кандидатов с помощью поиска по имени.

В одном случае operator+(a,b) мог найти функцию-член, когда сам оператор появился в классе (функция-член). Неквалифицированный поиск такого имени специально игнорирует членов класса, потому что они (нестатические как они есть) будут иметь неправильную арность и (очень часто) будут для неправильного типа (затенение все функции, не являющиеся членами для того же оператора!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...