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); 
} 

我知道它是可以使用复制和交换,但仍:这里是什么出了问题?

+2

此代码并不是特例安全的,如果您了解swap,为什么会问这样的问题?为什么你会写这样糟糕的代码!你的代码的问题是显式调用构造函数是非法的。在已经分配的内存上调用构造函数的唯一方法是使用placement new(至少在C++ 03中)。如果第二种语法适用于你的编译器,那么我怀疑它是标准的。 – Phil1970

+2

*“为什么第二个解决方案能够工作,但不是第一个解决方案?” - 可能是因为您正在使用有缺陷的编译器或使用错误的选项调用它。 –

回答

-1

那么,在海湾合作委员会这两个是不允许的。我的猜测是,如果你的编译器允许一个而不是另一个,那么这是为了避免消除歧义。

当您编写this->Arr()时,编译器无法知道您打算调用构造函数,而不是仅仅实例化一个新对象。

当你写this->Arr::Arr(),那么编译器知道你叫静态功能类ArrArr()

相关问题