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

时间:2018-05-11 16:46:56

标签: c++

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

你的猜测是正确的。在3rd行编译器只知道此类型存在。你向前宣布它。 unique_ptr的定义方式是给出与常规指针类似的语义。在2nd行中,您承诺编译器在真正需要时实际定义类,并且编译器确实需要Data类的定义来调用p中的数据上的析构函数。 / p>

sizeof错误是强迫&#34;强制&#34;在某一点完成类型定义(在这种情况下是为了防止UB在delete析构函数中对不完整类型调用p。)