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

Я читал этот хороший ответ, касающийся "правила пяти", и заметил кое-что, чего не помню, когда видел раньше:

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

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

2 ответа

Решение

Это часть функции, позволяющая нестатическим функциям-членам C++11 различать, вызываются ли они для l-значений или r-значений.

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

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

C c{};
c = C{};

Это не:

C{} = c;

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

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

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

C() = x;
Другие вопросы по тегам