在下面的代码中,wrapper
声明了一个包含a 的对象movable
,其中T
是一个不完整的类型.构造析构函数movable
是为了在没有完全知识的情况下无法实例化T
,但是wrapper
析构函数只是向前声明,这意味着如果~movable()
在定义的时候实例化它就足够了~wrapper()
.
#include
template
struct movable {
movable() noexcept = default;
~movable() noexcept { (void) sizeof(T); }
movable(const movable&) noexcept = delete;
movable(movable &&) noexcept = default;
};
template
class wrapper {
public:
movable m;
wrapper() noexcept = default;
wrapper(wrapper &&) noexcept = default;
~wrapper();
};
struct incomplete;
int main() {
/* extern */ wrapper original;
wrapper copy(std::move(original));
}
(在这里试试)
但是,wrapper()
想要实例化~movable()
.我得到的是,如果发生异常,成员的破坏必须是可能的,但是movable()
并且wrapper()
都是noexcept.有趣的是,移动构造函数工作正常(尝试取消注释extern
示例代码中的部分.)
这种行为的原因是什么,有没有办法规避它?