带有未定义参数的unique_ptr实例化不会导致错误

pol*_*181 4 c++

#include <memory>
class Data;
std::unique_ptr<Data> p;
//class Data{}; // not working without this
int main(){}
Run Code Online (Sandbox Code Playgroud)

使用g ++ - 5编译此代码会出现这样的错误:

将'sizeof'无效应用于不完整类型'数据'

有人可以解释为什么我取消注释第四行编译会成功吗?据我所知,在第3行编译器没有关于类型数据的完整信息.我们这行只有前瞻性声明.真实声明发生在第4行.

use*_*670 6

类型的目标类型unique_ptr在模板实例化时可能是不完整的,但必须在unique_ptr可能尝试处理存储的指针时完成,因为它将default_delete被调用.如果您使用自定义删除器,则目标类型可能仍然不完整.

  • 换句话说,在OP的代码中,它是`unique_ptr`的析构函数的瞬间(它似乎发生在翻译单元的末尾,因为它是一个全局变量),它需要`Data`才能完成. (2认同)