1
我重载了Arr类的赋值运算符。这是通过使用析构函数删除旧对象(并释放分配的内存),然后使用复制构造函数(先前被重载)来使调用对象成为rhs的副本来实现的。 this图片显示了两种不同的方式来做到这一点(只有第50行和第57行不同)。为什么第二个解决方案可行,但不是第一个?从赋值运算符调用构造函数
的错误消息是“类型名称是不允许的”
Arr& Arr::operator=(const Arr& rhs) {
this->~Arr();
this->Arr(rhs); // I get an error here: type name is not allowed
return (*this);
}
Arr& Arr::operator=(const Arr& rhs) {
this->~Arr();
this->Arr::Arr(rhs);
return (*this);
}
我知道它是可以使用复制和交换,但仍:这里是什么出了问题?
此代码并不是特例安全的,如果您了解swap,为什么会问这样的问题?为什么你会写这样糟糕的代码!你的代码的问题是显式调用构造函数是非法的。在已经分配的内存上调用构造函数的唯一方法是使用placement new(至少在C++ 03中)。如果第二种语法适用于你的编译器,那么我怀疑它是标准的。 – Phil1970
*“为什么第二个解决方案能够工作,但不是第一个解决方案?” - 可能是因为您正在使用有缺陷的编译器或使用错误的选项调用它。 –