C ++에서 버전간에 표현식 유형이 변경된 이유는 무엇입니까? 한 결과는 prvalue입니다. 12, 7.3e5 또는

C ++ 초안을 이해하기가 어려워서 C ++ 초안을 소화하기가 매우 어려워 다른 리소스를 선호하기 때문에 표현 유형 을 이해하려고 합니다. C ++ 버전 간의 표현 및 정의가 크게 변경되었습니다.

다음에서는 다음과 같은 초안을 참조합니다.

  • C ++ 11 [ n3690 ] (최종 초안)
  • C ++ 17 [ n4659 ] (최종 초안)
  • C ++ 20 [ n4835 ] (현재 초안)

C++11 3.10 L 값과 r 값

… prvalue ( “순수한 rvalue”)는 xvalue가 아닌 rvalue입니다. [예 : 반환 유형이 참조가 아닌 함수를 호출 한 결과는 prvalue입니다. 12, 7.3e5 또는 true와 같은 리터럴 값도 prvalue입니다. — 최종 예]

C++17 3.10 L 값과 r 값

… prvalue는 평가에서 객체 또는 비트 필드를 초기화하거나 표시되는 컨텍스트에 지정된대로 연산자의 피연산자 값을 계산하는 표현식입니다.

C++20 7.2.1 가치 범주 *

… prvalue는 평가에서 객체 또는 비트 필드를 초기화하거나, 표시되는 컨텍스트 또는 cv void 유형의 표현식에 지정된 연산자의 피연산자 값을 계산하는 표현식입니다.

나는 문구 변경 사항을 이해하고 약간의 조정이 이루어졌지만 나에게는 전체 정의가 변경되었습니다. 누군가 내가 이것을 이해하도록 도울 수 있습니까? 예를 들어, prvalue가 xvalue가 아닌 rvalue라는 문장이 왜 제거 되었습니까? 또는 왜 유용한 예가 제거 되었습니까?



답변

원래의 전치 정의는 레이블 일뿐입니다. 특정 rvalue (즉, xvalue가 아닌)를 따로 설정하고 이름을 지정합니다. 비정상적인 this사용을 통해 (임시이기 때문에 다소간에)를 제외하고는 주소를 알 수 없으므로 어떤 자유를 만들지 않고 생성 및 전파를 통해 특정 자유를 얻을 수 있습니다. (또한 “신분을 가지지 않는”그들에 대한 최근 토론 을 참조하십시오 .)

새로운 정의에 따르면 prvalue는 “기다리고있다”는 초기화입니다. 일단 대상 객체가 식별되면 초기화됩니다. (초기 위치 가 아닌 prvalue가 구성 될 때 초기화가 여전히 발생한다는 점에 유의하는 것이 중요합니다 .) 이는 이미 일반적으로 사용되는 동등한 최적화를 기반으로하는 “필수 복사 제거”의 이름을 따릅니다.

예를 들어, 새로운 가치 범주 정의는 훨씬 더 간단한 것으로 보았으므로 더 적은 예가 필요했습니다. xvalues ​​(가장 미묘한 범주)에 대해서는 여전히 하나가 있습니다.


답변