xvalue를 상수가 아닌 lvalue 참조로 캐스팅 할 때 gcc 및 clang에서 컴파일러 오류가 일치하지 않는 이유는 무엇입니까? [복제]

Nov 18 2020

누군가 두 컴파일러가 두 번째 예제에서 오류를 던지고 gcc 만 첫 번째 예제에서 오류를 던지는 이유를 설명 할 수 있습니까? static_castxvalue 의 결과와 관련이 있습니까?

int& example1 = reinterpret_cast<int&>(static_cast<int&&>(10));
//(gcc 10.2) error: invalid cast of an rvalue expression of type 'int' to type 'int&'
//(clang 11.0.0) no errors

int& example2 = reinterpret_cast<int&>(10);
//(gcc 10.2) error: invalid cast of an rvalue expression of type 'int' to type 'int&'
//(clang 11.0.0) error: reinterpret_cast from rvalue to reference type 'int &'

또한 확실하지 않지만 표준에 따르면 xvalue는 glvalue의 유형이기 때문에 첫 번째 예제가 잘 구성되어 있다고 생각합니다. 그리고 표준의이 [expr.reinterpret.cast] / 11 부분은 T1 glvalue를 "T2에 대한 참조"유형으로 캐스팅 할 수 있어야한다고 말합니다.이 경우 T1은 T2와 동일한 유형입니다.

답변

4 dfrib Nov 18 2020 at 12:32
reinterpret_cast<int&>(10);

이 프로그램은 변환되는 표현식이 prvalue이므로 형식이 잘못되었습니다. 가입일 [expr.reinterpret.cast] / 1 :

표현식 reinterpret_­cast<T>(v)의 결과는 표현식 v을 유형 으로 변환 한 결과입니다 T. 경우 T좌변의 참조 형 또는 함수 타입에 r- 수치 참조는, 그 결과는 좌변이다 ; [...] 명시 적으로 사용하여 수행 할 수있는 변환 reinterpret_­cast은 다음과 같습니다. 사용하여 명시 적으로 다른 변환을 수행 할 수 없습니다reinterpret_­cast .

다음에 나오는 절 reinterpret_cast은 포인터가 아닌 (p) rvalue 의 from a를 허용 하지 않습니다.


#include <memory>
reinterpret_cast<int&>(std::move(10));

여기에서 변환되는 표현식은 xvalue이며 @LanguageLawyer (이 Q & A의 속임수 대상 임)의 주석에 연결된 Q & A에서 볼 수 있습니다.

  • reinterpret_cast (또는 캐스트)가 xvalue를 lvalue로 변환 할 수 있습니까?

이는 C ++ 14 (C ++ 11에 대한 DR 수정으로 업데이트 됨) 및 CWG 1268 의 실제 구현에서 잘 구성되어 있습니다 .

1268. xvalue 피연산자의 reinterpret_cast 섹션 : 8.2.10 [expr.reinterpret.cast]

상태 : CD3

제출자 : Michael Wong

날짜 : 2011-03-21

[2012 년 10 월 회의에서 DR로 이동했습니다.]

8.2.10 [expr.reinterpret.cast] 단락 11, 참조 유형으로의 캐스팅을 다루는 것은 lvalue 피연산자 만 허용합니다. 아마도 대상이 rvalue 참조 유형일 때 glvalue 피연산자를 허용해야 합니다.

[...]

강조 표시된 세그먼트는 대상이 rvalue 참조 인 경우에만이를 허용하도록 제안하지만 실제로 업데이트 된 [expr.reinterpret.cast] / 11 이이 제한을 제거했습니다.

결과적으로 GCC는 첫 번째 예를 거부하는 것이 잘못되었습니다.