You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2017中std::promise<T>是否要求T可默认构造?编译报错咨询

为什么Visual Studio 2017编译std::promise<std::reference_wrapper<int>>会报错?

这绝对是Visual Studio 2017中STL实现的明确bug,不符合C++标准的要求——你的代码本身是完全合法的,GCC和Clang的行为才是正确的。

咱们来拆解一下问题:

  • 你写的代码只是构造了一个std::promise<std::reference_wrapper<int>>对象,没有对它执行任何赋值或取值操作。根据C++11及之后的标准,std::promise的默认构造函数只需要创建一个空的共享状态,完全不需要默认构造模板参数T类型的对象——毕竟此时promise还没有关联任何具体的值,只有当你调用set_value这类方法时,才需要构造或传入T类型的实例。
  • std::reference_wrapper<int>没有默认构造函数是它的设计特性(必须绑定到一个具体的int对象才能实例化),但这根本不影响std::promise的默认构造,因为标准里从未要求std::promise的默认构造依赖T的默认构造能力。

VS2017的STL实现在这里犯了错:它错误地在std::promise的默认构造阶段尝试默认构造T类型的对象,这才触发了C2512错误。这个问题在Visual Studio 2019及之后的版本里已经被修复了,如果你升级到更高版本的VS,这段代码就能正常编译了。

内容的提问来源于stack exchange,提问作者Christian Blume

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:30