簡體   English   中英

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

[英]Removing the void specializations for std::future and std::promise

關於描述刪除 std::future 和 std::promise P0241R0 的無效特化的論文 這可能是一個愚蠢的問題,但建議的解決方案是完全刪除 void 特化,但是當人們想要實例化std::future<void>對象時,他們期望做什么?

如參考文獻中所述, 如果void是常規類型,這將是可能的。

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

這是它在其他一些語言中的工作方式,因此並非沒有先例。 在其他語言中,它被稱為“單位”類型,因為它只有一個可能的值。 (其他語言也有“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 的目的是知道一個沒有實際返回值的進程何時結束。 所以基本上它是一個同步工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM