为什么使用`declval <U&>()来定义`is_destructible` .~U()`而不是'declval <U>().~U()`?

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()被视为未评估的操作数时,表达式是格式良好的,其中Uremove_­all_­extents_­t<T>.

它为什么使用declval<U&>().~U()而不是declval<U>().~U()

declvalhttps://cplusplus.github.io/LWG/issue2049中添加了措辞以解决定义与抽象类型的问题.也许作者认为它declval<U>有返回类型U所以它不适用于抽象类型?

Lan*_*yer 5

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

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

我非常确定我不相信这declval()T直接返回的 ,此辅助功能在我的脑海中深深地燃烧了;-)