Что означает амперсанд после этого оператора присваивания?
Я читал этот хороший ответ, касающийся "правила пяти", и заметил кое-что, чего не помню, когда видел раньше:
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;