C++ 从赋值运算符调用构造函数

C++ 从赋值运算符调用构造函数,c++,constructor,operator-overloading,assignment-operator,C++,Constructor,Operator Overloading,Assignment Operator,我正在重载类Arr的赋值运算符。这是通过使用析构函数删除旧对象(并释放分配的内存),然后使用复制构造函数(以前重载过)使调用对象成为rhs的副本来实现的。图中显示了两种不同的方法(只有第50行和第57行不同)。为什么第二种解决方案有效,而第一种却不行 错误消息为“不允许使用类型名称” 我知道可以使用复制和交换,但是:这里出了什么问题?好吧,在GCC中,两者都是不允许的。我的猜测是,如果编译器允许其中一个,但不允许另一个,那么这是为了避免歧义消除 当您编写this->Arr()时,编译器无法知道您

我正在重载类Arr的赋值运算符。这是通过使用析构函数删除旧对象(并释放分配的内存),然后使用复制构造函数(以前重载过)使调用对象成为rhs的副本来实现的。图中显示了两种不同的方法(只有第50行和第57行不同)。为什么第二种解决方案有效,而第一种却不行

错误消息为“不允许使用类型名称”


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

好吧,在GCC中,两者都是不允许的。我的猜测是,如果编译器允许其中一个,但不允许另一个,那么这是为了避免歧义消除

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


当您编写
this->Arr::Arr()
时,编译器知道您调用了类
Arr
的静态函数
Arr()

此代码不是异常安全的,如果您知道swap,为什么会问这样的问题?你为什么要写这么糟糕的代码!代码的问题是显式调用构造函数是非法的。在已分配内存上调用构造函数的唯一方法是使用布局new(至少用C++ 03)。如果第二种语法适用于您的编译器,那么我怀疑它是否标准。“为什么第二种解决方案有效,而第一种却不行?”——可能是因为您使用的编译器有缺陷,或者使用了错误的选项集来调用它。
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);
}