递归模板实例化在 dtor 中超出错误,但在 ctor 中没有。为什么?

亲爱的

尝试 clang++ 和 g++,两者的结果相同。
fatal error: recursive template instantiation exceeded maximum depth

template<class T>
struct Bar {
  ~Bar() {
    if (ptr) { delete ptr; }
  }
  Bar<Bar<T>> * ptr{nullptr};
};

int main() { Bar<void> obj; }

但是 ctor 版本编译没有错误:

template<class T>
struct Bar {
  Bar() {
    if (ptr) { delete ptr; }
  }
  Bar<Bar<T>> * ptr{nullptr};
};

int main() { Bar<void> obj; }

dtor 版本有什么问题?

说书人 - Unslander Monica

dtor 版本有什么问题?

想想像这样的声明Bar<void> obj;意味着什么

该对象需要在main返回时调用其析构函数所以析构函数~Bar<void>将被实例化。

实例化的析构函数包含什么?一个delete表情。您可能会认为它处于无效检查之下,因此永远不会被执行,但这并不重要。C++ 代码是静态解析的,即使编译器可以消除死代码,也必须是正确的

delete表达式将需要调用 的析构函数Bar<Bar<void>>,因此它必须被实例化......冲洗并重复。

另一方面,在构造函数版本中,您有一个简单的析构函数。它什么都不做,当然也不需要实例化任何其他类型。因此,当构造函数必须实例化它时,它编译得很好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

调用 ctor/dtor 中已删除的函数“addressof”

{$WARN DUPLICATE_CTOR_DTOR OFF} 从 Dpk 文件中删除

C ++中重载乘法运算符的递归类模板实例化期间的错误

多个文件中的模板实例化

在不同文件中模板化模板实例化

为什么导入 Mixed Native/CLR lib/dll 的本机 C++ 应用程序不在 Mixed lib/dll 中的外部变量上调用 ctor/dtor

重载之前模板实例化中的错误

与模板实例化有关的编译错误

类模板实例化中的类型转换

GCC中的模板实例化与Visual C ++不同

在C ++模板实例化中查找从属名称

GNU C ++和Clang中的模板实例化

类模板实例化中的携带类型信息

为什么允许分配器覆盖其value_type的ctor和dtor?

为什么在模板实例化中不允许使用lambda?

铛。致命错误:递归模板实例化超出最大深度

为什么C ++函数模板实例化的返回类型包含在错误的函数名称中?

为什么 ctor 中的 std::initializer_list 没有按预期运行?

RAII失败-为什么此C ++代码泄漏?-在try块中放入ctor可以防止dtor

为什么在 Linux 上的 CLANG 3.5 在抛出 CTOR 时调用 DTOR 时会清理两次“std::string”?

typedef中的模板实例化是否具有有限的作用域?

dtor中的unique_lock有什么用吗?

在C ++中的模板实例化中将带有构造函数的类用作类型参数

类中现有成员的模板实例化检查

不同翻译单元中的模板实例

如何在C ++中编写代码以执行条件模板实例化

如何在模板实例化中强制将char []转换为char *?

MainWindowViewModel ctor中的RequestNavigate

模板助手中的异常:错误:无法在没有DOM的模板实例上使用$