int x = x에서 Lvalue-to-Rvalue 변환 및 정의되지 않은 동작;
C에서 초기화되지 않은 값을 할당할지 여부에 대한 질문 그 자체로 정의되지 않은 동작을 구성하는 것은 논쟁의 주제였습니다. 표준(3.3.2)에서는 int x = x; 예와 같이 변수 자체를 초기화하면 예상치 못한 결과가 발생할 수 있다고 선언합니다.
문제의 핵심은 lvalue에 대한 잠재적 요구 사항에 있습니다. 그러한 할당에서 rvalue로의 변환. 오른쪽 x가 불확실한 값을 갖는 초기화되지 않은 자동 변수라고 가정합니다. 표준(4.1)에 따르면 이러한 값에 대해 lvalue에서 rvalue로 변환을 수행하면 정의되지 않은 동작이 발생합니다.
Lvalue에서 Rvalue로 변환에 대한 증거
표준에 명시적인 요구 사항이 없음에도 불구하고 기본 의도는 기본 제공 연산자가 기본적으로 prvalue를 기대하는 것임을 암시합니다. 예를 들어, 기본 제공 할당 연산자가 오른쪽 피연산자에 대해 lvalue에서 rvalue로의 변환을 수반한다는 표준 기록이 있습니다. 다른 조항은 또한 명시적으로 달리 지정하지 않는 한 일반적으로 lvalue에서 rvalue로의 변환이 예상됨을 나타냅니다.
추측을 초기화자로 확장
초기화는 할당과 다르지만, 가치 범주에 관한 표준의 모호성은 잠재적으로 이 영역까지 확장될 수 있습니다. 증거에 따르면 의도된 사양은 값이 필요할 때마다 prvalue를 기대하는 것입니다.
int x = x;
추측이 참이라고 가정하고 x를 다음으로 초기화합니다. 자체적으로는 초기화되지 않은 값에 대해 lvalue에서 rvalue로의 변환이 필요하므로 정의되지 않은 결과가 발생합니다.
증거 증거
초기화되지 않은 변수에 다양한 유형과 할당을 할당하는 코드를 고려하면 추가 증거가 발생합니다. 참조 초기화 시 lvalue에서 rvalue로의 변환을 금지하지만 객체 초기화에서는 이를 허용하는 등의 일관되지 않은 동작은 복사 초기화 시 lvalue에서 rvalue로의 변환이 예상된다는 견해에 신빙성을 더합니다.
또한 결함 보고서는 lvalue에서 rvalue로 변환하는 동안 정의되지 않은 동작의 맥락에서 개체 값을 "초기화되지 않은" 값에서 "불확실한 값"으로 재정의하는 명시적 언어를 도입하는 것을 목표로 합니다. 이는 int x = x;와 같은 경우 정의되지 않은 동작을 설정하려는 의도를 나타냅니다.
결론
제시된 증거에 따르면 초기화 int x = x;에서 lvalue에서 rvalue로의 변환이 필요하다는 결론을 내리는 것이 합리적입니다. 결과적으로 오른쪽 x의 초기화되지 않은 특성으로 인해 정의되지 않은 동작이 발생합니다. 표준의 불일치와 설명의 필요성은 값 범주에 대한 세부 사양의 중요성을 강조합니다.
위 내용은 Lvalue-Rvalue 변환으로 인해 `int x = x;` 정의되지 않은 동작이 발생합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!