删除std :: future和std :: promise的void特化

时间:2017-05-19 22:23:00

标签: c++ c++11 c++14 future c++17

关于描述删除std :: future和std :: promise P0241R0的void特化的论文。这可能是一个愚蠢的问题,但建议的解决方案是完全删除void专门化,但是当他们想要实例化std::future<void>对象时,人们期望做什么?

3 个答案:

答案 0 :(得分:5)

如参考文献中所述,这可能是if void were a regular type

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

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

答案 1 :(得分:0)

在修改了 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()
  {
    ...
  }
}

答案 2 :(得分:-3)

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