【问题标题】:Why is `is_­destructible` defined using `declval<U&>().~U()` and not `declval<U>().~U()`?为什么使用 `declval<U&>().~U()` 而不是 `declval<U>().~U()` 定义 `is_destructible`?
【发布时间】:2019-02-14 21:44:10
【问题描述】:

根据is_destructible (http://eel.is/c++draft/meta.unary.prop#lib:is_destructible) 的定义,is_­destructible_v&lt;T&gt;true 当:

T 是一个引用类型,或者T 是一个完整的对象类型,表达式declval&lt;U&amp;&gt;().~U() 在被视为未计算的操作数时是格式正确的,其中Uremove_­all_­extents_­t&lt;T&gt;

为什么它使用declval&lt;U&amp;&gt;().~U()而不是declval&lt;U&gt;().~U()

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

【问题讨论】:

  • 在这一点上,看起来唯一的选择就是问问 Daniel Krugler :)
  • 一个引用可以限定析构函数吗? ~U()&amp;&amp; {stuff}?
  • @MooingDuck no.

标签: c++ language-lawyer typetraits


【解决方案1】:

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

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

我很确定我不相信 declval() 正在返回 直接T,这个辅助功能在我脑海里烙印太深了;-)

【讨论】:

    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2015-06-12
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多