#include <memory>
class Data;
std::unique_ptr<Data> p;
//class Data{}; // not working without this
int main(){}
使用g ++ - 5编译此代码会出现这样的错误:
将'sizeof'无效应用于不完整类型'数据'
有人可以解释为什么我取消注释第四行编译会成功吗?据我所知,在第3行编译器没有关于类型数据的完整信息。我们这行只有前瞻性声明。真实的声明发生在第4行。
答案 0 :(得分:6)
unique_ptr
类型的目标类型在模板实例化时可能不完整,但必须在unique_ptr
尝试处理存储指针时完成,因为它是{的要求{1}}将被调用。如果您使用自定义删除器,则目标类型可能仍然不完整。
答案 1 :(得分:2)
你的猜测是正确的。在3rd
行编译器只知道此类型存在。你向前宣布它。 unique_ptr
的定义方式是给出与常规指针类似的语义。在2nd
行中,您承诺编译器在真正需要时实际定义类,并且编译器确实需要Data
类的定义来调用p
中的数据上的析构函数。 / p>
sizeof
错误是强迫&#34;强制&#34;在某一点完成类型定义(在这种情况下是为了防止UB在delete
析构函数中对不完整类型调用p
。)