1

클래스 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); 
} 

나는 그것을 복사 및 스왑을 사용할 수 있습니다 알고 있지만, 여전히 "유형 이름이 허용되지 않습니다"인가?

+2

이 코드는 예외적 인 예외는 아니며 스왑에 대해 알고 있다면 왜 그런 질문을합니까? 왜 그렇게 나쁜 코드를 작성하겠습니까! 귀하의 코드 문제는 명시 적으로 생성자를 호출하는 것은 불법입니다. 이미 할당 된 메모리에서 생성자를 호출하는 유일한 방법은 새로운 배치를 사용하는 것입니다 (적어도 C++ 03에서는). 컴파일러에서 두 번째 구문이 작동한다면 표준이라고 생각하지 않습니다. – Phil1970

+2

* "왜 두 번째 솔루션이 효과가 있지만 첫 번째 솔루션이 작동하지 않습니까?"* - 아마도 결함이있는 컴파일러를 사용하고 있거나 잘못된 옵션 집합을 사용하여이를 호출했기 때문일 수 있습니다. –

답변

-1

음, GCC에서는 허용되지 않습니다. 필자의 컴파일러는 컴파일러가 하나만 허용하지만 다른 것은 허용하지 않는 경우에는 모호성을 피하는 것입니다.

this->Arr()을 쓸 때 컴파일러는 새 개체를 인스턴스화하는 대신 생성자를 호출한다는 것을 알 수 없습니다. 당신이 this->Arr::Arr()을 쓸 때

후 컴파일러는 당신이 정적 기능 클래스 ArrArr() 전화 것을 알고있다.