문제

tl; dr

다음 코드가 주어졌습니다.

int* ptr;
*ptr = 0;
.

*ptr는 간접적 인 것을 적용하기 전에 ptr lvalue-rvalue 변환이 필요합니까?

표준은 많은 장소에서 lvalue-rovalue 의 주제를 포함하지만 * 연산자 이 그러한 변환이 필요한지 여부를 결정하기에 충분한 정보를 지정하는 것으로 보인다.

세부 정보

lvalue-rovalue 변환은 n3485 섹션 4.1 섹션의 단락 1 ( 강조가 앞으로) ) :

비 기능의 GLValue (3.10), 비 배열 형 T 형이 변환 될 수 있습니다. pvalue.53 t가 불완전한 유형 인 경우 이 전환이 필요합니다. 그 대상이 GLValue가 t 형태의 대상이 아니며 객체가 아닙니다. t, 또는 객체가 초기화되지 않은 경우, 프로그램 이 변환이 필요하지 않으면 정의되지 않은 동작 [...]

*ptr = 0; 이 변환을 필요로합니까

섹션 4 단락 1 섹션으로 이동하면 다음과 같습니다.

[...] 표준 변환 순서가 표현식에 적용됩니다. 필요한 경우 에 필요한 대상 유형으로 변환하십시오.

필요한 은 언제입니까? 5 섹션을 보면 섹션을 보면

단락 9 에서 언급 된 lvalue-rvalue 변환이 언급됩니다.

오퍼레이터의 피연산자로 glvalue 표현식이 나타날 때마다 그 피연산자에 대한 pravalue, lvalue-to-rvalue (4.1), 배열 - 포인터 (4.2) 또는 기능 - 포인터 (4.3) 표준 표현식을 PRVALUE로 변환하는 데 전환이 적용됩니다. [...]

및 단락 11 :

일부 컨텍스트에서는 표현식이 부작용에만 나타납니다. 이러한 표현식을 삭제 된 값 표현이라고합니다. [...] lvalue-to-rvalue 변환 (4.1)이 적용됩니다. 표현은 휘발성 자격이있는 유형의 lvalue이며 그 중 하나입니다. 다음 [...]

도이 코드 샘플 및 5.3.1 단락 1 에있는이 코드 샘플 및 ptr 1 에 적용되는 것으로 보입니다.

단항 * 운영자는 간접적으로 수행합니다 : 표현식 적용되는 것은 물체 유형의 포인터 또는 a의 포인터가되어야한다. 기능 유형과 결과는 객체를 참조하거나 표현식이 지적하는 기능. 표현식의 유형 "To To to T"는 "결과 유형이"T. "입니다. [참고 : 간접적 인 불완전한 유형 (CV void 이외의)에 대한 포인터를 통해 유효합니다. 얻어진 LValue는 제한된 방식으로 사용될 수 있습니다 ( 참조, 예를 들어); 이 lvalue는 A로 변환해서는 안됩니다 pravalue, 4.1을 참조하십시오. - end note]

포인터의 가치 을 요구하는 것 같지 않으며, 나는 여기에 누락 된 것을 누락 한 것입니다.

왜 우리가 걱정합니까?

초기화되지 않은 포인터의 사용을 주장하는 다른 질문에 대한 답변과 의견을 보았습니다. 예 : 정확히 C ++ 표준 초기화되지 않은 포인터가 정의되지 않은 동작이라는 역할을 할 수 있습니다. 이 인수를 만들고 표준의 최근 초안 버전 중 하나에서 배치 된 것과 논쟁을 조정할 수 없습니다. 나는 이것을 여러 번 보았으므로 나는 명확 해지고 싶었다.

정의되지 않은 문제의 실제 증거는 위의 링크 된 질문에서 언급했듯이 다른 사람들이 정의되지 않은 행동에 도달하는 다른 방법을 가지고 있기 때문에 중요하지 않습니다.

도움이 되었습니까?

해결책 2

이 시점에서 내 질문에 대한 업데이트 섹션을 대답으로 변환했습니다.이 시점에서 내 질문이 답이되지 않는 불만족스러운 것 같습니다.

매우 비슷한 지상을 덮는 두 개의 관련 스레드를 가리키 셨습니다.

컨센서스는 표준이 아픈 이므로 내가 찾는 대답을 제공 할 수 없으므로 Joseph Mansfield 이 사양 부족에 대한 결함 보고서를 게시했으며, 여전히 열기

표준의 의도 에 대한 몇 가지 상식 인수가 있습니다. 하나는 Logicially. , 조작이 해당 피연산자의 값을 사용해야하는 경우 피연산자가 PRVALUE입니다 . 다른 인수는 C99 초안을 돌려 보내는 것입니다. 표준 기본적으로 RVALUE 변환에 대한 LVALUE가 기본적으로 수행되며 예외가 표시됩니다. 초안 C99 표준의 관련 섹션은 6.3.2.1 lvalues, 배열 및 함수 지정자 2 단락 2 입니다.

CIZEOF 운영자의 피연산자, 단항 및 연산자, ++ 운영자, 연산자 또는 왼쪽 피연산자 인 경우를 제외하고는 운영자 또는 과제 운영자, 배열 유형이없는 lvalue는 지정된 객체에 저장된 값으로 변환됩니다 (더 이상 LValue가 아닙니다). [...]

피연산자 의 값으로 변환되고 간접 간접적 인 이 예외가 아니기 때문에 기본적으로 일부 예외를 예외로 전환시킨다. > C ++ 은 실제로 내 질문에 대한 답변을 에 대답 할 것입니다.

정의되지 않은 행동의 증명을 명확히하려고 시도했을 때 LValue-to-RValue 변환이 위임되는지 여부를 명확히하는 것보다 덜 중요했습니다. 우리가 정의되지 않은 행동을 증명하려는 경우 대체 접근법이 있습니다. Jerry의 접근 방식은 간접적 인 에서는 간접적 인 에서는 객체 또는 기능에 대한 포인터가되고 불확정 값은 유효한 객체의 사고 지점에 의해서만 나타납니다. 일반적으로 C ++ 표준 초안은 C ++ 11의 C99 초안 표준 단수 값 의 개념을 가지고 있으며, 24.2.1 섹션에서 다음과 같이 말합니다.

[...] [예 : 초기화되지 않은 포인터 X (int * x와 같이), X는 항상 포인터의 단일 값을 갖는 것으로 가정해야합니다. -mend example] [...] 역 참조 가능한 값은 항상 비 형식입니다.

및 :

유효하지 않은 반복자는 단수 일 수있는 반복기입니다. 268

및 각주 268이 말합니다 :

이 정의는 포인터가 반복되는이기 때문에 포인터에 적용됩니다. 무효화 된 반복자를 역 참조하는 효과는 정의되지 않습니다.

C ++ 1Y

다른 팁

나는 당신이 오히려 비스듬한 각에서 이것을 접근시키는 것으로 생각하므로 말할 수 있습니다.§5.3.1 / 1에 따르면 :

단조의 * 연산자는 간접 을 수행합니다. : 적용되는 표현식은 객체 유형 또는 함수 유형에 대한 포인터가 객체 또는 함수를 참조하는 LValue입니다. 표현 지점.표현식 유형이 "To To T to T"인 경우 결과의 유형은 "t"입니다

LValue-to-rvalue 변환에 대해 설명하지는 않지만 표현식이 객체 또는 함수에 대한 포인터 일 필요가 있습니다.초기화되지 않은 포인터는 (아마도 사고로 인한 것, 아마도) 역시가 정의되지 않도록 시도가 정의되지 않은 행동을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top