Lan*_*yer 18 c++ type-traits language-lawyer
根据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>()在所讨论的上下文中这将返回右值引用(从而返回右值),但是在我的心理想象中,我想表达翻译p->~T(),根据语言再次对应于(*p).~T()([expr.ref]),因此逻辑上的结果是更改std::declval()调用以生成T析构函数应用于的左值。我非常确定我不相信这
declval()是T直接返回的 ,此辅助功能在我的脑海中深深地燃烧了;-)