Квалификаторы &&
и &
в функции-члене, подобные этой, указывают на следующее:
- Квалифицированная функция
&
будет вызываться для экземпляров lvalue объекта - Квалифицированная функция
&&
будет вызываться для rvalue экземпляров объекта
Пример:
#include <iostream>
class Example
{
private:
int whatever = 0;
public:
Example() = default;
// Lvalue ref qualifier
void getWhatever() & { std::cout << "This is called on lvalue instances of Example\n"; }
// Rvalue ref qualifier
void getWhatever() && { std::cout << "This is called on rvalue instances of Example\n"; }
};
int main()
{
// Create example
Example a;
// Calls the lvalue version of the function since it's called on an lvalue
a.getWhatever();
// Calls rvalue version by making temporary
Example().getWhatever();
return 0;
}
Вывод этого:
This is called on lvalue instances of Example
This is called on rvalue instances of Example
Так как в первом вызове функции мы вызываем его для экземпляра lvalue Example
, но во втором вызове мы делаем его временным, для которого мы вызываем функцию, вызывая квалифицированную функцию rvalue.