在思考这个问题时,我偶然发现了一些我不明白的东西。
标准说...
如果一个类没有用户声明的析构函数,则析构函数被隐式声明为默认值。隐式声明的析构函数是其类的内联公共成员。
[...] 如果一个类有一个带有虚拟析构函数的基类,那么它的析构函数(无论是用户声明的还是隐式声明的)都是虚拟的。
默认且未定义为已删除的析构函数在使用 odr 或在其第一次声明后显式默认时隐式定义。
[...]如果它不是纯的,则虚拟成员函数是 odr-used 的。[...]
所以现在我想知道这段代码是否应该编译:
#include <memory>
struct Base {
virtual ~Base() = default;
};
struct Bar;
struct Foo : Base {
std::unique_ptr<Bar> bar_{};
};
我认为~Foo()
必须隐式定义,因为它是虚拟的,但它不会编译,因为Bar
在这个 TU 中不完整。然而,代码可以在所有主要编译器中编译。
我错过了什么?