default;
?
это объявление виртуального деструктора. Там где требуется, как минимум в виртуальных классах
Смущает default. Зачем его тут употреблять?
чтобы не писать пустое тело реализации, если на этом уровне нет никаких динамических ресурсов, которые надо освобождать или все динамические ресурсы находятся под управлением других объектов (по типу unique_ptr и т.п.)
А если в иерархии классов в одном классе пишут virtual ~deriv() = default;, в другом пишут virtual ~deriv2() {} в третьем вообще не объявляют деструктор никак, то это норм или могут быть проблемы?
никаких, главное, чтобы пустое или дефолтное тело было осознанным: у тебя все динамические ресурсы под контролем
главное, чтобы оно в базовом классе было, через указатель на который все эти наследники полиморфно педалируются
если где-то по цепочке наследований будет в реализации выделение памяти, то нужно в этом виртуальном деструкторе его высвободить. Просто принято его явно указывать, даже пустой, чтобы было очевидно что память не выделяется
А есть разница между пустым и дефолтным телом?
А вот для конструкторов где-то читал/видел, что это не так и пустой конструктор это не то же самое, что объявленный со словом default.
Привет , основной акк попал в бан из за спама . Можно его как ни будь вытащить ?
Да, нужно перестать спамить
Чтобы не писать пустое тело деструктора явно и не делать отдельно определение этой функции-члена
По теме default или пустое тело для конструктора. Пример. Спасибо Константину Владимирову.
Я же правильно понимаю, что тут каст Bar в int - это UB?
Скажите, а есть ли подвох с деструктором с пустым телом и деструктором с default?
Почему?
Пустотелый остается нетривиальным, тривиальность разрушения - одно из необходимых условий для trivially-copyable, trivial и implicit-lifetime. Эти свойства, в свою очередь, позволяют многие неявные операции с лайфтаймами выполнять.
Вычисление (lval->rval) indeterminate value у Bar::x.
UB происходит в тот момент, когда мы используем indeterminate value и при этом не важно как?
Когда оно "вычисляется", да. Вычисление - это lval->rval преобразование (получение элемента множества значений, соответствующего текущей репрезентации значения). Подробно про это (и исключения из правила) здесь.
Обсуждают сегодня