gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:06:32 26 4
gpt4 key购买 nike

尝试 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 版本有什么问题?

最佳答案

What's the problem with dtor version?


想想像 Bar<void> obj; 这样的声明方法。
该对象需要在 main 时调用其析构函数返回。所以析构函数 ~Bar<void>将被实例化。
实例化的析构函数包含什么?一个 delete表达。您可能会推断它处于无效检查之下,因此永远不会被执行,但这并不重要。 C++ 代码是静态解析的,必须正确 即使 编译器可以消除死代码。
那个 delete表达式将需要调用 Bar<Bar<void>> 的析构函数,因此必须实例化...冲洗并重复。
另一方面,在构造函数版本中,您有一个简单的析构函数。它什么都不做,当然也不需要实例化任何其他类型。因此,当构造函数必须实例化它时,它编译得很好。

关于c++ - 递归模板实例化在 dtor 中超出错误,但在 ctor 中没有。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68692264/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com