C ++ - Что это означает, когда вы ставите амперсанд (&) перед ссылкой на rvalue? - PullRequest
0 голосов
/ 01 марта 2020

Итак, у меня есть этот код:

foo<T>& foo<T>::operator=(foo&& M) 
{
  if (this != &M)
  {
    // Do something
  }
}

, и я совершенно не понимаю, что здесь означает this != &M. Что происходит, когда вы пытаетесь получить адрес памяти для ссылки на rvalue? Это то, что этот код пытается сделать?

  1. Что именно делает this != &F? Что он проверяет?
  2. Какова цель использования ссылки на rvalue в качестве параметра для оператора присваивания?

Извините, если это глупо. Я новичок в C ++ и пытаюсь узнать, как работают ссылки на rvalue и почему они используются в подобных случаях.

Спасибо!

Ответы [ 2 ]

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

Это просто проверка на самостоятельное назначение. Если адрес передаваемого объекта совпадает с this, то ничего не делать.

0 голосов
/ 01 марта 2020

Сначала кажется, что вы не правильно просматриваете ссылки. Ссылки - это что-то вроде указателей для предотвращения копирования всех объектов в вызовах функций. По этой причине мы используем ссылки на объекты, которые могут быть большими порциями памяти c (например, mtrices). Но есть некоторые различия с указателями. После создания ссылки c она выглядит как обычная переменная (нет необходимости *, & для доступа к ее значению и адресу)

this != &M означает, что адрес М равен этому?

Он предназначен для проверки того, являются ли этот и другие объекты одинаковыми объектами или нет. Если да, просто верните текущий объект. А если нет, очистите базовые данные ... и скопируйте данные M в текущий объект , но, похоже, эта реализация не завершена. Я не вижу копирующих выражений ...

...