根据is_destructible (destructible)的定义,在以下情况下,is_destructible_v<T>是true:
T是一个引用类型,或者T是一个完整的对象类型,当将表达式declval<U&>().~U()作为未计算的操作数处理时,表达式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,所以它不适用于抽象类型?
发布于 2019-02-16 21:06:50
于是我通过电子邮件问丹尼尔·克鲁格,他允许我公布他的答案:
好问题--尽管答案相当琐碎,并且没有透露任何语言秘密:我知道
std::declval<T>()会在讨论的上下文中返回一个rvalue引用(因此是一个rvalue),但在我的脑海中,我想表达翻译p->~T()的图片,这同样符合(*p).~T()(expr.ref),所以逻辑上的结果是更改std::declval()调用以生成应用析构函数的T的lvalue。 我很确定我不相信declval()直接返回了T,这个助手函数在我的脑海中被深深地烧掉了;)
https://stackoverflow.com/questions/54699526
复制相似问题