C ++ - о перегрузках оператора присваивания - PullRequest
0 голосов
/ 20 марта 2020

Я экспериментировал с созданием интерфейсов кода с классами C ++.

И загадочная вещь, возникшая при тестировании, - это перегрузка операторов присваивания. Посмотрите на код ниже:

struct my_object {
  // This doesn't work. :(
  friend int& operator =(int& variable, my_object object)
  { variable = object.value; return variable; }

  // This works, but `int value; value <<= my_object{};` 
  // for `int value; value = my_object{};` doesn't seem clean...
  friend int& operator <<=(int& variable, my_object object)
  { variable = object.value; return variable; }
};

Мое замешательство: Первая перегрузка не компилируется и регистрирует эту ошибку на консольном терминале.

'friend int& operator =(int&, my_object)' must be a nonstatic member function

Но затем вторая перегрузка компилируется без ошибок (или предупреждений), несмотря на то, что она почти идентична первой.

Почему перегрузка первого оператора недопустима, а второй, по-видимому, исправен (по крайней мере, компилятором G CC 6.3.0 )?

1 Ответ

2 голосов
/ 20 марта 2020

Операторы =, () (вызов функции) и [] должны быть членами класса. Другие операторы, как правило, могут быть членами или не членами.

Из этого следует, что единственный случай, когда вы можете перегрузить оператор присваивания, - это определение класса с левой стороны. Невозможно написать пользовательский оператор присваивания, левый аргумент которого не является типом класса.

Чтобы назначить my_object на int, вместо этого необходимо написать функцию преобразования:

struct my_object {
    operator int() const { return value; }
    // ...
    int value;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...