Что означает амперсанд после этого оператора присваивания?

Я читал этот хороший ответ в отношении "Правила пяти", и я заметил то, что я не помню, увидев раньше:

class C {
  ...
  C& operator=(const C&) & = default;
  C& operator=(C&&) & = default;
  ...
};

Какова цель символа &, помещенного перед = default для оператора присваивания копирования и для оператора присваивания переадресации? Кто-нибудь имеет ссылку для этого?

Ответ 1

Это часть функции, позволяющая нестационарным функциям С++ 11 различать, вызывается ли они на lvalues ​​или rvalues.

В приведенном выше случае оператор присваивания копии, по умолчанию здесь, может быть вызван только на lvalues. Это использует правила для привязки ссылок lvalue и rvalue, которые хорошо установлены; это просто устанавливает их для this.

В приведенном выше случае оператор присваивания копий по умолчанию используется только в том случае, если копируемый объект может связываться с ссылкой на константу lvalue. Так что это нормально:

C c{};
c = C{};

Это не:

C{} = c;

Временное здесь не может связываться с ссылкой lvalue, и поэтому оператор присваивания копий не может быть вызван. И поскольку это объявление предотвратит создание обычного оператора присваивания копий, этот синтаксис эффективно предотвращает присвоение копии (или перемещение-присваивание) во временные. Чтобы восстановить это, вам нужно добавить версию &&:

C& operator=(const C&) && = default;
C& operator=(C&&) && = default;

Ответ 2

Это означает, что эта функция доступна только для lvalues. Таким образом, это не будет выполнено, потому что оператор-оператор присваивания вызывается в выражении объекта rvalue:

C() = x;