지정되지 않은 암시 적 객체 생성


9

때문에 낮은 수준의 객체 조작을 위해 객체 P0593 내재적으로 작성이 허용 된 오브젝트가 작성 될 수있다 내재적 20 ++ C이다.

특히 제안에 의해 도입 된 문구 (예 : 특정 작업 할 수 있습니다 std::malloc자동으로이) 특정 유형의 객체의 수명, 소위 만들고 시작 암시 평생 유형을 , 경우 같은 오브젝트의 도입이 가지고 그렇지 않으면 정의되지 않은 동작으로 인해 프로그램 정의 된 행동. [intro.object] / 10을 참조하십시오 .

초안은 이제 프로그램 정의 동작을 내재적으로 생성하기 위해 암시 적으로 생성 될 수있는 이러한 객체의 여러 세트가있는 경우 이러한 세트 중 어떤 세트가 작성되는지 지정되지 않았다고 명시 합니다. (관련 문장은 내가 접근 할 수있는 마지막 제안 개정판 인 R5에는 없지만, 커밋 초안에 있습니다.)

실제로 내재적으로 생성 된이 객체 집합의 선택을 관찰 할 수있는 프로그램이 있습니까? 다시 말해,이 새로운 규칙을 통해 정의되었지만 지정되지 않은 동작을 가진 프로그램이 있습니까? 즉, 하나 이상의 가능한 개체 중 하나의 암시 적 개체 집합이 생성 된 출력을 유추 할 수 있습니까?

아니면이 문장은 단순히 추상 기계에서의 프로그램 실행을 명확히하기위한 것입니까 (관찰 할 수있는 영향은 없습니까)


2
(OT) 내재적으로 생성 된 객체가 int라면 "implicit int"라고 부를 수 있습니까?
MM

지정되지 않은 세트에서 요소의 선택이 malloc의 시점에서 알려 져야하는지 확실하지 않은 것 같습니다
MM

@ MM 세트 선택은 추상적으로 실행 흐름 외부의 전체 프로그램 실행에 대한 단일 선택으로 간주되는 것으로 가정했지만 문제의 작업 (예 :)에서 생성이 직접 std::malloc발생하면 정의에 문제가 발생합니다. 미래에 따라 재귀 적으로.
호두

해당 주제에 대해 다른 질문을했습니다 . stackoverflow.com/questions/60627249 물론 더 많은 추론 자들이 떠오를 수 있지만 한 번에 한 가지 질문이있다.
MM

제안은 그렇게 구별하는 것이 불가능하다고 주장하는데, 이는 선택이 "올바르게"이루어질 수있는 방법이 없기 때문에이를 피하기위한 최적화 만이 그렇지 않으면 ( 매우 엄격하게) 유효 할 것이기 때문에 중요 하다.
Davis Herring

답변:


9

표준의 예를 들어 조금 변경해 봅시다.

#include <cstdlib>
struct X { int a, b; };
X *make_x() {
  // The call to std::malloc implicitly creates an object of type X
  // and its subobjects a and b, and returns a pointer to that X object
  // (or an object that is pointer-interconvertible ([basic.compound]) with it),
  // in order to give the subsequent class member access operations
  // defined behavior.
  X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
  p->a = 1;
  p->b = 2;
  return p;
}

이전에는 해당 저장소에서 암시 적으로 만들 수있는 유효한 개체 집합이 하나만 있었으며 정확히 하나 여야했습니다 X. 그러나 이제 우리는 두 개의 저장소를 가지고 X있지만 그중 하나에 만 쓰십시오.이 프로그램의 나머지 부분은 나머지 바이트에 닿지 않습니다. 따라서 암시 적으로 생성 될 수있는 여러 가지 객체 집합이 있습니다. 아마도 2 X초, 1 X, 2 int초, 아마도 X8 char초입니다.

실제 관측치가있는 경우 유효한 세트로만 가능성이 줄어들 기 때문에 어떤 세트가 생성되었는지는 관찰 할 수 없습니다. 우리가 이와 같은 일을 p[1]->a = 3한다면, 가능성의 세계는 두 개의 Xs를 가진 것으로 무너 집니다.

즉, 암시 적으로 생성 된 여러 개체 집합은 프로그램에서 유효성을 구분하기에 충분한 관측치가없는 경우에만 가능합니다. 구별 할 수있는 방법이 있다면 정의에 따라 모두 유효하지는 않습니다.


어쨌든 이것은 내 추측입니다.
Barry

따라서 정의되지 않은 동작없이 다른 암시 적 수명 유형의 객체의 존재 여부를 구별 / 관찰 할 수있는 방법이 없다는 것을 취합니다. 이 경우 실제로 다른 관찰 가능한 결과를 초래할 수없는 표준에서 " 지정되지 않은 동작 "을 사용하는 것 같습니다 .
호두

1
또는 전용 액세스 유형의 glvalues를 통해 [이력서] 어떤 경우 char, unsigned char또는 std::byte? 사소하게 복사 가능한 유형의 객체도 존재할 수 있습니다.
23:00에

2
원래 예에서도 하나의 X객체 와 함께 배열 객체를 생성 할 수도 있습니다 .
TC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.