Я читал это хороший ответ что касается «правила пяти», и я заметил кое-что, что не помню, видел раньше:
class C {
...
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
...
};
Какова цель &
персонаж размещен перед = default
для оператора назначения копирования и для оператора назначения перемещения? У кого-нибудь есть ссылка на это?
Это часть функции, позволяющая нестатическим функциям-членам C ++ 11 различать, вызываются ли они для l-значений или r-значений.
В приведенном выше случае оператор назначения копирования по умолчанию здесь может быть вызван только для lvalues. При этом используются правила для привязок ссылок lvalue и rvalue, которые хорошо установлены; это просто устанавливает их для this
,
В приведенном выше случае оператор присваивания по умолчанию используется по умолчанию, только если копируемый объект может связываться с неконстантной ссылкой на lvalue. Так что это хорошо
C c{};
c = C{};
Это не:
C{} = c;
Временные здесь не могут связываться со ссылкой lvalue, и, следовательно, оператор назначения копирования не может быть вызван. И поскольку это объявление будет препятствовать созданию обычного оператора назначения копирования, этот синтаксис эффективно предотвращает назначение копирования (или перемещение-назначение) для временных. Для того, чтобы восстановить это, вам нужно будет добавить &&
версия:
C& operator=(const C&) && = default;
C& operator=(C&&) && = default;
Это означает, что эта функция доступна только для lvalues. Так что это не удастся, потому что функция оператора присваивания вызывается для выражения объекта rvalue:
C() = x;