> 백엔드 개발 > C++ > C 이동 할당 연산자에서 `if (this != &rhs)` 확인이 필요합니까?

C 이동 할당 연산자에서 `if (this != &rhs)` 확인이 필요합니까?

Mary-Kate Olsen
풀어 주다: 2024-12-05 22:16:11
원래의
611명이 탐색했습니다.

Do We Need the `if (this != &rhs)` Check in C   Move Assignment Operators?

이동 할당 연산자 및 if (this != &rhs)

클래스의 복사 할당 연산자에서는 일반적입니다. 할당된 개체가 방지할 호출 개체인지 확인하려면 자체 할당:

Class& Class::operator=(const Class& rhs) {
    if (this != &rhs) {
        // Do the assignment
    }

    return *this;
}
로그인 후 복사

이 검사는 개체가 자신에게 할당되어 예기치 않은 동작이나 오류가 발생하는 것을 방지하는 데 중요합니다. 그런데 이동 할당 연산자의 경우 이 검사의 필요성이 논란의 여지가 있습니다.

이동 할당 연산자에도 동일한 검사가 필요한가요?

Class& Class::operator=(Class&& rhs) {
    if (this != &rhs) {
        // Do the assignment
    }

    return *this;
}
로그인 후 복사

이동 할당 연산자에 대해 == &rhs가 참인 상황이 있을 수 있는지에 대한 의문이 제기됩니다. 대답은 이동 할당 연산자의 해석에 따라 다릅니다.

이동 할당 연산자의 해석:

이동 할당 연산자에는 두 가지 주요 해석이 있습니다.

  1. 현재 가치 보존: 일부에서는 자체 이동 할당이 필요하다고 주장합니다. (여기서 this == &rhs)은 객체의 현재 값을 유지해야 합니다. 이 경우 실수로 자체 할당을 방지하려면 if(this != &rhs) 검사가 필요합니다.
  2. 유효한 상태로 설정: 다른 사람들은 자체 이동 할당 연산자가 반드시 현재 값을 보존할 필요는 없지만 객체를 유효한 상태로 유지해야 합니다. 이 경우 if(this != &rhs) 검사는 꼭 필요한 것은 아닙니다. 그러나 자체 할당 시 이동 작업을 수행하지 않는 최적화로는 여전히 유용할 수 있습니다.

현재 및 미래 표준:

The C 11 표준은 이동 할당 연산자의 특정 해석을 명시적으로 요구하지 않습니다. 그러나 프로그래머는 이동 할당 연산자의 구현을 통해 동작을 정의할 수 있습니다.

제안된 C 20 작업 초안에는 자체 이동 할당이 충돌해서는 안 된다고 제안하는 이동 할당에 대한 섹션이 포함되어 있지만 현재 값을 유지해야 하는지 아니면 객체를 유효하지만 지정되지 않은 상태로 남겨 두어야 하는지 지정하지 않습니다. state.

결론:

이동 할당 연산자에서 if(this != &rhs) 검사의 필요성은 해석과 특정 구현 요구 사항의 문제입니다. 자체 이동 할당이 현재 값을 유지할 것으로 예상되는 경우 확인이 필요합니다. 그렇지 않은 경우 최적화를 위해 생략할 수 있습니다.

위 내용은 C 이동 할당 연산자에서 `if (this != &rhs)` 확인이 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿