【问题标题】:std::promise<T> where T must be default constructible in Visual Studio 2017?std::promise<T> 其中 T 必须是 Visual Studio 2017 中默认可构造的?
【发布时间】:2018-04-14 11:19:44
【问题描述】:

我正在尝试在 Visual Studio 2017 中编译以下代码:

#include <future>

int main()
{
    std::promise<std::reference_wrapper<int>> promise;
    (void)promise;
}

但是,我收到以下错误:

错误 C2512:“std::reference_wrapper”:没有合适的默认构造函数可用

而 GCC 和 Clang 可以很好地编译。

这是 Visual Studio 中的明确错误还是 std::promise 的有效实现?

【问题讨论】:

    标签: c++


    【解决方案1】:

    看起来它是 MSVC 标准库实现中的 known issue。 更简单的复制场景:

    #include <future>
    struct NoDefaultCtor
    {
        NoDefaultCtor() = delete;
    };
    int main() {
        std::promise<NoDefaultCtor> p;
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      我想你不需要std::reference_wrapper&lt;int&gt;std::promise 有合适的重载模板可用:

      template<class R> class promise<R&>;
      

      因此,您可以在 Visual Studio 2017 中修复您的代码:

      #include <future>
      
      int main()
      {
          std::promise<int&> promise;
          (void)promise;
      }
      

      【讨论】:

      • 这在某些情况下可能是一种有效的解决方法,但不能解决关于 T 必须是默认可构造的实际问题。
      猜你喜欢
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      相关资源
      最近更新 更多