클래스 Arr에 대한 대입 연산자가 오버로드되고 있습니다. 소멸자를 사용하여 이전 객체를 삭제하고 할당 된 메모리를 해제 한 다음 이전에 오버로드 된 copy-constructor를 사용하여 호출 객체를 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);
}
나는 그것을 복사 및 스왑을 사용할 수 있습니다 알고 있지만, 여전히 "유형 이름이 허용되지 않습니다"인가?
이 코드는 예외적 인 예외는 아니며 스왑에 대해 알고 있다면 왜 그런 질문을합니까? 왜 그렇게 나쁜 코드를 작성하겠습니까! 귀하의 코드 문제는 명시 적으로 생성자를 호출하는 것은 불법입니다. 이미 할당 된 메모리에서 생성자를 호출하는 유일한 방법은 새로운 배치를 사용하는 것입니다 (적어도 C++ 03에서는). 컴파일러에서 두 번째 구문이 작동한다면 표준이라고 생각하지 않습니다. – Phil1970
* "왜 두 번째 솔루션이 효과가 있지만 첫 번째 솔루션이 작동하지 않습니까?"* - 아마도 결함이있는 컴파일러를 사용하고 있거나 잘못된 옵션 집합을 사용하여이를 호출했기 때문일 수 있습니다. –