【问题标题】:Removing the void specializations for std::future and std::promise删除 std::future 和 std::promise 的 void 特化
【发布时间】:2017-05-19 22:22:59
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 直接回答“人们期望做什么”的问题 - 他们没有什么不同future<void> 不会消失,只是不需要专业化。
    • @DrewDormann:据我了解,你最终必须做出一些改变,因为删除 std::promise<void> 特化意味着 set_value() 函数不再存在,你必须调用 @改为 987654327@。
    • void x 声明无效,但作为安慰奖,return void-expression 构造在 C 和 C++ 中都有效,例如你可以在其他函数中写return get_value();。它与future<void> 问题本身没有任何关系,但它是编写自文档代码的有用方法,这意味着“这是退出此函数时要执行的操作”。这可能是风格/偏好的问题,我发现它有时是一个有用的习语,尤其是在使用它作为唯一尾部优化提示的更简单的 C 编译器上(否则他们不会这样做)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这没有回答问题。
      猜你喜欢
      • 2014-11-10
      • 1970-01-01
      • 2016-03-14
      • 2022-01-15
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多