Зачем нужны && и & после метода в классе? 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 шт):
Это перегрузка по вызову функций для 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/