为什么使用isdeclval <u&>()。〜U()而不是使用declval <u>()。〜U()定义is_`destructible?

时间:2019-02-14 21:44:11

标签: c++ language-lawyer typetraits

根据is_destructiblehttp://eel.is/c++draft/meta.unary.prop#lib:is_destructible)的定义,在以下情况下,is_­destructible_v<T>true

  

T是引用类型,或者T是完整的对象类型,当将其declval<U&>().~U()视为未经评估的操作数时,其格式正确(其中{{1} }是U

为什么使用remove_­all_­extents_­t<T>而不使用declval<U&>().~U()

https://cplusplus.github.io/LWG/issue2049中添加了带有declval<U>().~U()的措词,以解决定义与抽象类型有关的问题。也许作者认为declval的返回类型为declval<U>,所以它不适用于抽象类型吗?

1 个答案:

答案 0 :(得分:4)

所以我通过电子邮件问了丹尼尔·克鲁格勒,他让我发布了他的答案:

  

好问题-尽管答案相当琐碎,而且没有揭示   任何语言的秘密:我知道std::declval<T>()将返回   在所讨论的上下文中的右值引用(因此是右值),但是   在我的心理想象中,我想表达   翻译p->~T(),根据语言再次对应   到(*p).~T()([expr.ref]),因此逻辑上的结果是更改   std::declval()调用以生成T的左值,其中   析构函数已应用于。

     

我非常确定我不相信declval()返回了   T直接将这个辅助功能深深地烙在我的脑海里;-)