> 백엔드 개발 > C++ > 오버로딩 연산자는 사용자 정의 유형의 `i = i`와 같은 표현식에서 정의되지 않은 동작을 제거합니까?

오버로딩 연산자는 사용자 정의 유형의 `i = i`와 같은 표현식에서 정의되지 않은 동작을 제거합니까?

DDD
풀어 주다: 2024-12-22 19:27:13
원래의
888명이 탐색했습니다.

Does Overloading Operators Eliminate Undefined Behavior in Expressions like `i  =   i` with User-Defined Types?

정의되지 않은 동작 및 시퀀스 포인트 재검토

i = i 표현식은 i가 내장 유형일 때 정의되지 않은 동작을 호출하는 것으로 표시되었습니다. . 그러나 i가 사용자 정의 유형인 경우 유사한 표현식의 동작에 대한 의문이 제기됩니다.

사용자 정의 유형 고려 사항

Index 유형은 다음과 같이 정의됩니다.

class Index {
    int state;

    public:
        Index(int s) : state(s) {}
        Index& operator++() {
            state++;
            return *this;
        }
        Index& operator+=(const Index &index) {
            state += index.state;
            return *this;
        }
        operator int() {
            return state;
        }
        Index& add(const Index &index) {
            state += index.state;
            return *this;
        }
        Index& inc() {
            state++;
            return *this;
        }
};
로그인 후 복사

다음과 같은 표현식이 있을까요? i.operator =(i.operator ()); 또는 i.add(i.inc()); 아직도 정의되지 않은 동작을 호출합니까?

시퀀스 포인트 의미

표현식 i.operator =(i.operator ()); 다음과 같은 이유로 정의되지 않은 동작을 호출하지 않습니다.

  • 오버로드된 연산자는 평가 전후에 시퀀스 포인트가 있는 함수입니다.
  • 따라서 연산자 () 및 연산자 =() 호출은 -정의된 시퀀스 포인트.
  • 따라서 표현식은 시퀀스 포인트를 위반하지 않고 예상대로 동작합니다. rule.

비표현식 고려사항

원래 표현식 i = i는 과연 표현식인지에 대한 의문을 제기합니다. 그렇지 않은 경우 시퀀스 포인트 규칙이 적용되지 않을 수 있습니다. 그러나 이 인수는 표현식으로 구문 분석되고 실행되기 때문에 유지될 가능성이 없습니다.

다중 수정

관심 있는 다른 표현식, a[ i] = i , 또한 시퀀스 포인트 간의 잠재적인 수정으로 인해 질문이 제기됩니다. 그러나 a가 첨자 연산자를 오버로드하는 사용자 정의 유형인 경우에는 잘 정의됩니다.

표현 복잡도

C에서는 i 표현식이 잘 정의되어 있습니다. 03은 함수 사이에 잘 ​​정의된 시퀀스 포인트를 갖는 ((i.operator ()).operator ()).operator ()와 동일하기 때문입니다.

결론

사용자 정의 유형 및 시퀀스 포인트와 관련된 표현식의 동작은 연산자의 특정 구현에 따라 다릅니다. 오버로드된 연산자는 함수처럼 동작하여 시퀀스 포인트를 제공합니다. 그러나 표현식에 시퀀스 포인트 규칙이 적용되는지 여부는 구문 구조와 표현식으로서의 해석에 따라 달라질 수 있습니다.

위 내용은 오버로딩 연산자는 사용자 정의 유형의 `i = i`와 같은 표현식에서 정의되지 않은 동작을 제거합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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