Зачем нужны && и & после метода в классе? C++

Наткнулся на код, где в конце методов были && и &. Нечто подобное:

      class Quote {            
       public:     
           virtual Quote* clone() const & {return new Quote(*this);}            
           virtual Quote* clone() &&            
            {return new Quote(std::move(*this));}            
           // другие члены как прежде             
      };            

      class Bulk_quote : public Quote {            
           Bulk_quote* clone() const & {return new Bulk_quote(*this);}            
           Bulk_quote* clone() &&            
            {return new Bulk_quote(std::move(*this));}            
           // другие члены, как прежде             
      };            

Что делают символы & и && ПОСЛЕ метода? (Зачем они нужны в параметрах я знаю). Где можно почитать о таком их использовании и как это называется?


Ответы (1 шт):

Автор решения: KoVadim

Это перегрузка по вызову функций для lvalue (&) и rvalue (&&). Называется reference-qualified member functions.

То есть, если написать

Quote q;
q.clone();

будет вызвано clone с одним &, потому что q это lvalue.

А вот так

Quote().clone();

То будет вызван второй вариант.

Зачем это нужно? очевидно, что в некоторых случаях второй вариант может приводить к утечками и хотелось бы избежать и это можно сделать

virtual Quote* clone() const & {return new Quote(*this);}            
virtual Quote* clone() &&  = delete;

и второй вариант (Quote().clone();) не будет компилироваться

почитать больше https://habr.com/ru/post/216783/

→ Ссылка