Амперсанды в сигнатуре функции-члена

Скажите как называются амперсанды в сигнатуре функции-члена и какую роль они выполняют. Вот пример:

class some_class
{
  void foo() & ; 
  void foo() && ;
  void foo() const & ;
  void foo() const && ;
};

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

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

Они называются reference qualifiers.

& означает, что этот метод можно вызывать только на lvalue, а &&, соответственно - только на rvalue.

В качестве исключения, const & методы можно вызывать и на rvalue.


Некоторые навешивают & на operator=, чтобы some_class{} = ... не компилировалось.

Еще, их можно использовать для хитрых оптимизаций вроде:

class Vector
{
    std::vector<int> vec;

    const std::vector<int> &GetValue() const & {return vec;}
    std::vector<int> &&GetValue() && {return std::move(vec);}
};
→ Ссылка