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
相关产品推荐
相关产品推荐

