未定义的类不允许作为编译器内部类型特征“__is_destructible”的参数–问题解决记录

最近升级了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变量时,T还只是声明,没有定义,一般这种情况是少包含了类定义的头文件

做一个简单的示例来复现一下这个错误,发现报出了同样的问题(实锤)。

#include <future>

class A;

int main()
{
    std::future<A> a;
}

回到Lumberyard的代码里,分析代码缺的头文件,加上后问题解决。


本文为原创内容,遵循CC BY-ND 4.0协议,署名-禁止演绎。
转载请注明出处:https://tis.ac.cn/blog/kongdeyou/the_error_of_future_is_destructible/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注