最近升级了Visual Studio 2019的小版本,MSVC升级到了14.29.30037,然后导致了原先编译正常的Lumberyard代码,现在报出了如下错误:
...\2019\Community\VC\Tools\MSVC\14.29.30037\include\type_traits(736,28): error C2139: “OutcomeCallable”: 未定义的类不允许作为编译器内部类型特征“__is_destructible”的参数
【此处省略中间一大串模板栈展开的报错信息】
...\2019\Community\VC\Tools\MSVC\14.29.30037\include\future(880,56): error C2338: T in future<T> must meet the Cpp17Destructible requirements (N4878 [futures.unique.future]/4).
全网搜不到现成的解决方案,只好自己分析啦(顺便写篇博客记录一下)。
首先看了下错误栈最底下的future的880行,对比之前的版本和最新的版本:
template <class _Ty>
class future : public _State_manager<_Ty> {
...
static_assert(!is_array_v<_Ty> && is_object_v<_Ty>,
"T in future<T> must meet the Cpp17Destructible requirements (N4878 [futures.unique.future]/4).");
...
}
template <class _Ty>
class future : public _State_manager<_Ty> {
...
static_assert(!is_array_v<_Ty> && is_object_v<_Ty> && is_destructible_v<_Ty>,
"T in future<T> must meet the Cpp17Destructible requirements (N4878 [futures.unique.future]/4).");
...
}
新版本多了一个is_destructible_v<_Ty>。
在结合最顶层的错误信息,上微软官方文档查了error C2139的错误描述,通过分析官方文档上的示例,确定是类型只有声明没有定义时会报出这个错误。
因此,前面的问题的答案是,在is_destructible_v给_Ty类型时,只有声明,没有定义,往future里头套回去,就是在声明一个future
做一个简单的示例来复现一下这个错误,发现报出了同样的问题(实锤)。
#include <future>
class A;
int main()
{
std::future<A> a;
}
回到Lumberyard的代码里,分析代码缺的头文件,加上后问题解决。