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

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

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

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

47

Решение

Это часть функции, позволяющая нестатическим функциям-членам 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;
36

Другие решения

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

C() = x;
13

По вопросам рекламы [email protected]