unique_ptr 使用尚未定义的参数进行实例化不会导致错误
unique_ptr instantiation with argument that is not defined yet doesn't lead to error
#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 在析构函数中调用不完整类型p
delete
(。
相关文章:
- gcc出现不明确的模板实例化错误
- 类模板实例化错误
- C++11 列出 push_back() 实例化错误
- 由于命名空间而导致的对象实例化错误
- 在头文件中包含std::vector会导致模板实例化错误
- 实例化错误后成员函数模板的专业化,以及成员函数的顺序
- 类模板实例化错误:未在此范围内声明类型
- 模板类型名实例化错误
- 实例化错误后如何避免专业化
- 带有非类型参数的奇怪模板实例化错误
- 使用谓词模板函数从此处实例化错误
- GCC 4.9 中的模板实例化错误,在 GCC 4.8 中工作正常
- Visual Studio 2012 中的模板类实例化错误
- 类从这里实例化错误c++
- vc++函数模板实例化错误C2664当使用不同的枚举实参时
- ostringstream给了我隐式实例化错误
- Mountain Lion上的Mex文件:显式实例化错误
- 涉及无序映射的实例化错误
- 如何理解和修复递归模板实例化错误使用boostublas
- 从这里实例化错误