>백엔드 개발 >C++ >사용자 정의 유형에서도 `i = i;`가 정의되지 않은 동작입니까?

사용자 정의 유형에서도 `i = i;`가 정의되지 않은 동작입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-28 11:52:25773검색

Is `i  =   i;` Undefined Behavior Even with User-Defined Types?

정의되지 않은 동작 및 시퀀스 포인트: 심층 분석

표현식 i = i; 정의되지 않은 동작(UB)을 호출하는 것으로 레이블이 지정되었지만 제공된 Index 클래스에서와 같이 i의 유형이 사용자 정의인 경우 어떻게 될까요?

사용자 정의 유형 및 UB

Index와 같은 사용자 정의 유형의 경우 i = i; 여전히 UB로 간주됩니다. 이는 사용자 정의 유형이 증분 연산자의 기본 동작을 재정의하지 않기 때문입니다. 연산자 () 및 연산자 =() 함수는 Index 개체의 내부 상태만 수정하고 시퀀스 포인트를 생성하지 않습니다. 따라서 표현식은 연속된 시퀀스 포인트 사이에서 객체를 두 번 수정하여 UB가 됩니다.

표현식의 동등성

표현식 i.operator =(i.operator () ); 그리고 i.add(i.inc()); 원래 i = i;와 동일하지 않습니다. 첫 번째 표현식에서 i.operator() 평가 후 시퀀스 포인트를 사용하면 = 연산자 평가 전에 Index 개체를 수정할 수 있습니다. 마찬가지로 두 번째 식에서 멤버 함수 add 및 inc는 연속 시퀀스 지점 사이의 개체를 수정하지 않습니다. 따라서 이러한 표현식은 UB를 호출하지 않습니다.

표현식 정의 및 시퀀스 포인트

표현식 i = i; 실제로 표현식이지만 해당 동작이 잘 정의되어 있지 않습니다. 표현식과 연관된 시퀀스 포인트의 수는 관련된 피연산자의 유형에 의존하지 않습니다.

배열 첨자(a[ i] = i)

표현식 a [ 나는 ] = 나는; a가 내장 유형의 배열이거나 a가 아래 첨자 연산자를 오버로드하는 사용자 정의 유형인 경우 두 경우 모두 UB입니다. 두 경우 모두 [ i] 표현식이 먼저 평가되며, 이는 i를 증가시키고 사전 증가된 값을 반환합니다. 그런 다음 이 값은 배열에 대한 인덱스로 사용되며, 인덱스가 범위를 벗어나면 UB가 발생할 수 있습니다.

다중 증분 연산( i)

표현 나; C 03에서 잘 정의되어 있으며 ((((i.operator ()).operator ()).operator ()).operator ()).operator ()); 표현식과 동일한 동작을 갖습니다. 각 연산자() 호출은 Index 개체에 대한 참조를 반환하며, 각 함수 평가 후 시퀀스 포인트는 개체가 연속 시퀀스 포인트 사이에서 한 번만 수정되도록 보장합니다.

결론

요약하면, i = i; 그리고 a[ i] = i; 유형이 오버로드된 연산자를 제공하는 경우에도 사용자 정의 유형에 대해 UB를 호출합니다. Index 객체에 대한 다중 증분 연산은 잘 정의되어 있으며 시퀀스 지점과 시퀀스 지점 사이의 객체 수정 횟수가 관련된 피연산자 유형과 무관하다는 것을 보여줍니다.

위 내용은 사용자 정의 유형에서도 `i = i;`가 정의되지 않은 동작입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:CS- 5주차다음 기사:CS- 5주차