Константный квалификатор ссылки на функцию-член
-
21-12-2019 - |
Вопрос
Я видел там ответ:Является ли возврат по ссылке rvalue более эффективным?
Определение функции-члена:
Beta_ab const& getAB() const& { return ab; }
Я знаком с резюме-квалификатор (const
) на функциях-членах, но не const&
.
Что означает последний const&
иметь в виду?
Решение
А &
это ref-квалификатор.Ref-квалификаторы появились в C++11 и пока не поддерживаются всеми компиляторами, поэтому в настоящее время вы их не так часто встретите.Он указывает, что эту функцию можно вызывать только для lvalue (а не для rvalue):
#include <iostream>
class kitten
{
private:
int mood = 0;
public:
void pet() &
{
mood += 1;
}
};
int main()
{
kitten cat{};
cat.pet(); // ok
kitten{}.pet(); // not ok: cannot pet a temporary kitten
}
В сочетании с cv-квалификатором const
, это означает, что вы можете вызывать эту функцию-член только для lvalue, и они могут быть константными.
Другие советы
Мы знаем, что в этом коде...
Beta_ab const& getAB() const { return ab; }
^^^^^
Выделенный const
означает, что функция-член может быть вызвана const
объект.Функция-член всегда может быть вызвана для не-const
объект независимо от cv-квалификации функции.
Итак, в этом коде...
Beta_ab const& getAB() const & { return ab; }
^
Следует ожидать, что выделенное &
также кое-что говорит о том, к каким типам объектов разрешено вызывать эту функцию-член.Мы были бы правы;в C++11 это говорит о том, что функцию-член можно вызывать только для lvalue.
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return ab; }
В приведенном выше примере первая перегрузка вызывается для lvalue, а вторая перегрузка — для не-const
значения.Аналогично следующему, более знакомому примеру, с квалификаторами, применяемыми к обычным параметрам функции:
void setAB(AB const& _ab) { ab = _ab; }
void setAB(AB && _ab) { ab = std::move(_ab); }
Однако для обычных параметров это работает несколько иначе, как в этом примере, первая перегрузка приняла бы значение rvalue, если бы вторая перегрузка была удалена.