developer tip

C ++ 14에서 불확실한 값과 정의되지 않은 동작을 사용하는 것과 관련하여 C ++ 표준이 변경 되었습니까?

optionbox 2020. 12. 2. 08:30
반응형

C ++ 14에서 불확실한 값과 정의되지 않은 동작을 사용하는 것과 관련하여 C ++ 표준이 변경 되었습니까?


덮여으로 합니까 초기화 수반 좌변 투를 rvalue 변환? int x = x;UB는? C ++ 표준 3.3.2 의 선언 지점 섹션에 놀라운 예가 있습니다 . 여기서 an int은 자체 불확정 값으로 초기화됩니다.

int x = 12;
{ int x = x; }

여기서 두 번째 x는 자체 (미확정) 값으로 초기화됩니다. 최종 예 ]

이 질문에 대한 Johannes 답변은 lvalue에서 rvalue 로의 변환이 필요하기 때문에 정의되지 않은 동작을 나타냅니다.

여기N3936 에서 찾을 수있는 최신 C ++ 14 초안 표준 에서이 예제는 다음과 같이 변경되었습니다.

unsigned char x = 12;
{ unsigned char x = x; }

여기서 두 번째 x는 자체 (미확정) 값으로 초기화됩니다. 최종 예 ]

예제에서이 변경을 주도한 불확정 값 및 정의되지 않은 동작과 관련하여 C ++ 14에서 변경된 사항이 있습니까?


예,이 변경은 평가에 의해 불확실한 값이 생성되는 경우 정의되지 않은 동작을 만드는 언어의 변경에 의해 주도 되었지만 부호없는 좁은 문자에 대한 일부 예외가 있습니다.

제안 된 텍스트가 N3914 1 에서 찾을 수있는 결함 보고서 1787최근 2014 년에 승인되었으며 최신 작업 초안에 통합되었습니다 N3936.

불확정 값에 대한 가장 흥미로운 변화는 섹션에 될 8.512 에서 진행됩니다

개체에 대해 이니셜 라이저를 지정하지 않으면 개체는 기본적으로 초기화됩니다. 초기화가 수행되지 않으면 자동 또는 동적 저장 기간이있는 개체의 값이 결정되지 않습니다. [ 참고 : 정적 또는 스레드 저장 기간이있는 개체는 0으로 초기화됩니다. 3.6.2를 참조하십시오. 끝 참고 ]

에 ( 내 강조 ) :

개체에 대해 초기화 프로그램이 지정되지 않은 경우 개체는 기본적으로 초기화됩니다. 자동 또는 동적 저장 기간이있는 객체에 대한 저장소를 가져 오면 객체에 불확실한 값 이 있고 객체에 대해 초기화가 수행되지 않은 경우 해당 값이 대체 될 때까지 해당 객체는 불확실한 값을 유지합니다 (5.17 [expr.ass]). . [참고 : 정적 또는 스레드 저장 기간이있는 객체는 0으로 초기화됩니다. 3.6.2 [basic.start.init]를 참조하십시오. —end note] 평가에 의해 불확실한 값이 생성되는 경우 다음 경우를 제외하고 동작이 정의되지 않습니다 .

  • 다음을 평가하여 부호없는 좁은 문자 유형 (3.9.1 [basic.fundamental])의 불확실한 값이 생성되는 경우

    • 조건식의 두 번째 또는 세 번째 피연산자 (5.16 [expr.cond]),

    • 쉼표의 오른쪽 피연산자 (5.18 [expr.comma]),

    • 부호없는 좁은 문자 유형으로의 캐스트 또는 변환 피연산자 (4.7 [conv.integral], 5.2.3 [expr.type.conv], 5.2.9 [expr.static.cast], 5.4 [expr.cast]) , 또는

    • 폐기 된 값 표현 (Clause 5 [expr]),

    연산 결과는 불확실한 값입니다.

  • 첫 번째 피연산자가 unsigned Narrow의 lvalue 인 단순 할당 연산자 (5.17 [expr.ass])의 오른쪽 피연산자를 평가하여 부호없는 좁은 문자 유형 (3.9.1 [basic.fundamental])의 불확실한 값이 생성되는 경우 문자 유형, 불확정 값은 왼쪽 피연산자가 참조하는 객체의 값을 대체합니다.

  • 부호없는 좁은 문자 유형의 객체를 초기화 할 때 초기화 표현식을 평가하여 부호없는 좁은 문자 유형 (3.9.1 [basic.fundamental])의 불확실한 값이 생성되면 해당 객체는 불확실한 값으로 초기화됩니다.

다음 예를 포함했습니다.

[ 예 :

int f(bool b) {
  unsigned char c;
  unsigned char d = c; // OK, d has an indeterminate value
  int e = d;           // undefined behavior
  return b ? d : 0;    // undefined behavior if b is true
}

최종 예 ]

우리는이 텍스트 찾을 수 N3936 현재입니다 작업 초안N3937는 IS를 C++14 DIS.

C ++ 1y 이전

그것은 C는 달리이 초안 이전에하는 것이 흥미 롭다 항상 불확정 값으로 사용하는 것의 잘 지정된 개념을했다 정의했다 C ++에서 (심지어 그것을 정의하지 않고 용어 불확정 값을 사용하는 우리는 C99에서 정의를 빌릴 수없는 가정 )도 결함 보고서 616 참조 . 우리는에 의존했다 underspecified 좌변 투를 rvalue 변환초안 C ++ 11 표준이 섹션에 포함되어 4.1 좌변 투를 rvalue 변환1 밝히는 :

[...] 객체가 초기화되지 않은 경우이 변환을 필요로하는 프로그램은 정의되지 않은 동작을 갖습니다. [...]


각주 :

  1. 1787결함 보고서 616 의 개정판이며 N3903 에서 해당 정보를 찾을 수 있습니다.

참고 URL : https://stackoverflow.com/questions/23415661/has-c-standard-changed-with-respect-to-the-use-of-indeterminate-values-and-und

반응형