为什么使用`declval定义`is_destructible` ()。~U()`而不是`declval ()〜U()`?

问题描述 投票:17回答:1

根据is_destructiblehttp://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>()所以它不适用于抽象类型?

c++ language-lawyer typetraits
1个回答
5
投票

所以我通过电子邮件询问了DanielKrügler,他允许我发表他的回答:

好问题 - 虽然答案相当微不足道,并没有透露任何语言秘密:我知道p->~T()会在讨论的背景下返回一个右值参考(因而是一个右值),但在我的心理想象中,我想表达这些图片翻译(*p).~T(),再次根据语言对应std::declval()([expr.ref]),所以逻辑结果是改变T调用生成一个declval()的左值,其中析构函数被应用于。

我很确定我不相信T直接返回qazxswpoi,这个助手功能被我的脑海深深烧伤;-)

© www.soinside.com 2019 - 2024. All rights reserved.