По определению is_destructible
(http://eel.is/c++draft/meta.unary.prop#lib:is_destructible), is_destructible_v<T>
равно true
, когда:
Либо T
является ссылочным типом, либо T
являетсяполный тип объекта, для которого выражение declval<U&>().~U()
правильно сформировано, когда рассматривается как неоцененный операнд, где U
равно remove_all_extents_t<T>
.
Почему используется declval<U&>().~U()
, а не declval<U>().~U()
?
В https://cplusplus.github.io/LWG/issue2049 была добавлена формулировка с declval
для решения проблемы, возникшей в определении с абстрактными типами. Возможно, автор думал, что declval<U>
имеет тип возвращаемого значения U
, поэтомуэто не будет работать для абстрактных типов?