C ++에서 버전간에 표현식 유형이 변경된 이유는 무엇입니까?


13

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라는 문장이 왜 제거 되었습니까? 또는 왜 유용한 예가 제거 되었습니까?


3
버전 별 언어 태그를 금지하고 있습니다. 정확히 이런 종류의 질문을 제외하고.
curiousguy


" C ++ 버전 사이의 표현과 정의가 크게 바뀌는 것을 고려하지 마십시오. "그러나 정의는 실제로 바뀌지 않았습니다. C ++ 11에서 prvalue 인 표현은 C ++ 20에서 여전히 prvalue입니다.
Nicol Bolas

버전 사이의 '모순'은 어디에 있습니까? 질문이 정확히 무엇입니까?
Galigator

1
C ++ 20 변경에 대해 죄송 하지만 표준에 불일치가 있음을 발견했습니다.
Maggyero

답변:


5

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

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

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


당신과 논평자에게 감사합니다! 그것은 거의 그것을 설명합니다!
다니엘 스티븐스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.