根据is_destructible
(http://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>
,所以它不适用于抽象类型吗?
答案 0 :(得分:4)
所以我通过电子邮件问了丹尼尔·克鲁格勒,他让我发布了他的答案:
好问题-尽管答案相当琐碎,而且没有揭示 任何语言的秘密:我知道
std::declval<T>()
将返回 在所讨论的上下文中的右值引用(因此是右值),但是 在我的心理想象中,我想表达 翻译p->~T()
,根据语言再次对应 到(*p).~T()
([expr.ref]),因此逻辑上的结果是更改std::declval()
调用以生成T
的左值,其中 析构函数已应用于。我非常确定我不相信
declval()
返回了T
直接将这个辅助功能深深地烙在我的脑海里;-)