Classes and class hierarchies
C.166
Перегружайте унарный `&` только как часть системы умных указателей и ссылок
Причина
Оператор & фундаментален в C++. Многие части семантики C++ предполагают его значение по умолчанию.
Пример
class Ptr { // некоторый умный указатель
Ptr(X* pp) : p(pp) { /* проверка */ }
X* operator->() { /* проверка */ return p; }
X operator[](int i);
X operator*();
private:
T* p;
};
class X {
Ptr operator&() { return Ptr{this}; }
// ...
};
Примечание
Если вы «возитесь» с оператором &, убедитесь, что его определение имеет согласованные значения для ->, [], * и . для типа результата. Обратите внимание, что оператор . в настоящее время не может быть перегружен, поэтому идеальная система невозможна. Надеемся исправить это: Operator Dot (R2). Обратите внимание, что std::addressof() всегда возвращает встроенный указатель.
Контроль
Сложно. Предупреждать, если & определён пользователем, но -> для типа результата не определён.