删除 std::future 和 std::p romise 的空白专用化

Removing the void specializations for std::future and std::promise

本文关键字:std 空白 专用 future 删除 romise      更新时间:2023-10-16

关于描述删除std::future和std::p romise P0241R0的空白专业的论文。 这可能是一个愚蠢的问题,但提出的解决方案是完全消除空专用化,但是当人们想要实例化std::future<void>对象时,他们应该做什么呢?

如参考中所述,如果void是常规类型,这是可能的。

void get_value() {
    void x;
    return x;
}

这是它在其他一些语言中的工作方式,所以它并非没有先例。 在其他语言中,它被称为"单位"类型,因为它只有一个可能的值。 (其他语言也有"null"类型,它没有可能的值,所以如果你尝试创建一个,你会得到一个错误。 它被命名为"null",但它与 null 指针无关。

在修改

了实现 TS 之后,如果实现对 enable_if 做了一些聪明的事情,似乎可以避免专门针对 void,例如

template <class R>
R future<R>::get()
{
  return shared().get();
}
template <class R>
class shared_state {
  ...
  R get()
  {
    wait();
    if constexpr (!std::is_same_v<V, void>) {
      return *_value;
    }
  }
  template <typename V = value_t, std::enable_if_t<!std::is_same_v<V, void>, V>* = nullptr>
  void set_value(const V& value)
  {
    ...
  }
  template <typename V = value_t, std::enable_if_t<std::is_same_v<V, void>, V>* = nullptr>
  void set_value()
  {
    ...
  }
}

std::future 的目的是知道没有实际值返回的进程何时结束。所以基本上它是一个同步工具。