unique_ptr 使用尚未定义的参数进行实例化不会导致错误

unique_ptr instantiation with argument that is not defined yet doesn't lead to error

本文关键字:实例化 错误 参数 ptr 未定义 unique      更新时间:2023-10-16
#include <memory>
class Data;
std::unique_ptr<Data> p;
//class Data{}; // not working without this
int main(){}

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

对不完整类型"数据"的"sizeof"应用无效

有人可以解释为什么如果我取消注释第 4 行编译会成功吗?据我所知,在第三行编译器中没有关于数据类型的完整信息。我们在这一行中只有前向声明。真正的声明发生在第 4 行。

unique_ptr类型的目标类型在模板实例化时可能不完整,但在unique_ptr可能尝试释放存储的指针时必须完成,因为这是将要调用的default_delete的要求。如果您使用的是自定义删除程序,则目标类型可能仍然不完整。

你的猜测是正确的。在3rd行编译器只知道这种类型存在。你向前声明了它。unique_ptr以这种方式定义,以提供类似于常规指针的语义。2nd行中,您承诺编译器在真正需要时实际定义类,并且编译器确实需要Data类的定义来调用p中的数据析构函数。

sizeof错误是在某个点"强制"完整类型定义的常用方法(在这种情况下,以防止 UB 在析构函数中调用不完整类型pdelete(。