Выбор ответа Senior Правило 0/3/5 обновлено
Член-ссылка и присваивание
Вопрос
В классе есть член const Config& cfg;. Что компилятор сделает с операторами присваивания?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Объявит их удалёнными: ссылку нельзя перепривязать. Неявные копирующее и перемещающее присваивание определяются как удалённые, если у класса есть нестатический член-ссылка или const-член.
Варианты ответа
- Сгенерирует присваивание, которое копирует значение Config по ссылке
- Сгенерирует присваивание, перепривязывающее ссылку
- Объявит их удалёнными: ссылку нельзя перепривязатьправильный ответ
- Ошибка компиляции в момент объявления класса
Разбор
Неявные копирующее и перемещающее присваивание определяются как удалённые, если у класса есть нестатический член-ссылка или const-член. Конструкторы копирования при этом работают. Поэтому такие классы плохо живут в контейнерах; вместо ссылки часто хранят указатель или std::reference_wrapper.
- Присваивание через ссылку изменило бы чужой объект, стандарт так не делает.
- Перепривязать ссылку нельзя в принципе.
- Ошибка возникнет только при попытке присвоить.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Правило 0/3/5»
- Длинная арифметика: класс BigUint и факториал
- Класс матрицы 2×2 и быстрое возведение в степень
- Что даёт copy-and-swap
- Как написать оператор присваивания
- Куда пропал конструктор по умолчанию
- Пустой деструктор и перемещение
- Когда не генерируется перемещение
- Что объявили и что сгенерирует компилятор