Re[32]: Ошибка, если конструктор определен в h-файле (этюд?)
От: rg45 СССР  
Дата: 09.07.23 16:57
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Хотел еще узнать, знаете ли вы как оно внутри работает?


Там все несложно: объект делетера передается параметром по умолчанию в конструктор умного указателя и сохраняется в объекте умного указателя. А потом этот делетер вызызывается в деструкторе умного указателя.

И тут есть один не очень очевидный, но важный момент, который нужно понимать. В зависимости от реализации, вызова делетера может и не произойти — в деструкторе класса умного указателя может находиться проверка — вызывать делетер только при условии, если указатель ненулевой. НО! Эта проверка происходит во время выполнения. А static_assert срабатывает во время компиляции. Улавливаешь момент? Произодет вызов делетера или нет, во время компиляции не известно, но компилятор видит, что существует по крайней мере одна веточка в ветвлении программы, когда делетер МОЖЕТ быть вызван. Поэтому компилятор вынужден инстанцировать функцию-член operator() делетера. Вот при этом инстанцировании и срабатывает static_assert. Понятно объяснил?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 09.07.2023 17:08 rg45 . Предыдущая версия . Еще …
Отредактировано 09.07.2023 17:07 rg45 . Предыдущая версия .
Отредактировано 09.07.2023 17:06 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.