【问题标题】:What is the hash of a disengaged std::optional<T> object?脱离的 std::optional<T> 对象的哈希是多少?
【发布时间】:2013-10-02 08:18:39
【问题描述】:

来自 cppreference 的This page 提到 std::hash 已专门用于 std::optional,但未指定对象脱离时的行为。我能想到不同的行为:

  • 可以抛出std::bad_optional_access,与std::optional::value保持一致
  • 它可以为每个未参与的std::optional&lt;T&gt; 返回相同的哈希,这样两个未参与的对象将具有相同的哈希。
  • 它可以返回一个std::optional&lt;std::hash&lt;std::optional&lt;T&gt;&gt;&gt;

【问题讨论】:

  • 最后一个很有趣,但实际上没有意义:-S 奇怪的是,这没有指定。再说一次,该语言尚未发布。 Boost 是如何做到的?
  • 请注意,optional 已从 C++14 中删除。
  • @Simple 是吗?你碰巧有一个链接到报告的理由吗?我很想知道
  • 我昨天在 isocpp.org 上看到 optional 已从标准中删除并正在走向它自己的 TS,但我再也找不到那里的文章了。芝加哥会议的会议记录也尚未完成(通常会上传)。
  • 它已从 C++14 草案中删除,并将位于单独的“库基础”TS 中。关于如何定义optional 的比较,有太多未决问题并且没有达成共识,请参阅N3764N3765

标签: c++ hash standard-library optional c++14


【解决方案1】:

[optional.hash]/3 中说的 C++14 光盘:

对于optional&lt;T&gt; 类型的对象o,如果bool(o) == truehash&lt;optional&lt;T&gt;&gt;()(o) 的计算结果应与hash&lt;T&gt;()(*o) 相同。

所以我想说散列函数为脱离的对象返回什么是未指定的。

【讨论】:

  • 所以计算optional&lt;T&gt; 的哈希是未定义的行为
  • @qdii,未指定与未定义不同。在将元素插入默认构造的std::vector 后,向量的容量是未指定,因为它可以采用任何大于零的值,但使用向量并不是未定义的行为。如果hash&lt;optional&lt;T&gt;&gt; 有一个 Requires 子句说明先决条件,我同意它是未定义的,但我不确定。我当然不认为未定义的行为是有意的。
  • 现在是 LWG2333,将在指定 std::experimental::optional 的库基础 TS 中解决
  • 分辨率中的实际文本是“否则它的计算结果为未指定的值。”。所以实际上很清楚这不是未定义的行为。
【解决方案2】:

我不确定它是否相关,因为 C++14 最终没有 std::optional。正如乔纳森所说,其意图(尽管最初并未反映在标准语言中)一直是脱离的可选对象的哈希返回一个未指定的值。

这个意图反映在Fundamentals TS中。

这个想法是标准库的实现选择它想要如何表示一个不参与的optional&lt;T&gt; 并记录它自己。它可以为不同的类型选择不同的值,在调试和发布模式下也可以选择不同的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多