使用运算符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
具有相同的作用),代码将编译并运行。
使编译器生成的默认构造函数和用户定义的默认构造函数之间发生什么区别?
我在this posting中得到了一些提示,但是这里的C类(没有用户提供的构造函数)并不简单,因为析构函数是虚拟的,对吧?
与最新的Visual Studio一起编译,c ++ 17。
使编译器生成的默认构造函数和用户定义的默认构造函数之间发生什么区别?
new
关键字调用相应的operator new
,然后调用构造函数。如果构造函数抛出异常,则new
必须通过调用相应的operator new
来撤消operator delete
的影响。如果后者不可用,则new
无法完成其功能,从而导致编译器错误。
[default
构造函数不可能抛出异常,因此,不需要相应的operator delete
,因为它不会被new
表达式调用。