根据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()
而不是declval
?
使用https://cplusplus.github.io/LWG/issue2049的措辞被添加到declval<U>
中以解决定义与抽象类型的问题。也许作者认为U
有返回类型std::declval<T>()
所以它不适用于抽象类型?
所以我通过电子邮件询问了DanielKrügler,他允许我发表他的回答:
好问题 - 虽然答案相当微不足道,并没有透露任何语言秘密:我知道
p->~T()
会在讨论的背景下返回一个右值参考(因而是一个右值),但在我的心理想象中,我想表达这些图片翻译(*p).~T()
,再次根据语言对应std::declval()
([expr.ref]),所以逻辑结果是改变T
调用生成一个declval()
的左值,其中析构函数被应用于。我很确定我不相信
T
直接返回qazxswpoi,这个助手功能被我的脑海深深烧伤;-)