使用运算符new()创建类C的新对象会在此处产生错误:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
与 C2280: 'void C::operator delete(void *)': function was explicitly deleted
但是,当我更换C() {}
使用C() = default;
或删除线,使编译器插入一个默认的构造函数(我相信有同样的效果= default
),该代码将编译并运行。
使编译器生成的默认构造函数和用户定义的默认构造函数之间发生什么区别?
我在这篇文章中得到了一些提示,但是这里的C类(没有用户提供的构造函数)并不简单,因为析构函数是虚拟的,对吗?
与最新的Visual Studio c ++ 17一起编译。
operator delete()
构造函数是手动编写还是隐式生成的类似诊断。这符合我的期望-由于new
表达式可能会引发异常,因此编译器需要access operator delete()
。
noexcept
将使代码编译,但是如何...?
noexcept
如SebastianRedl所述,则operator delete
不必包含对的调用。同样,只有析构函数是虚拟的,g ++才会抱怨。否则,即使构造函数正在抛出,它也始终会编译。
noexcept