"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > ## **임시 하위 객체에 상수 참조를 바인딩하면 수명이 연장되나요? GCC와 Clang 이야기**

## **임시 하위 객체에 상수 참조를 바인딩하면 수명이 연장되나요? GCC와 Clang 이야기**

2024-11-09에 게시됨
검색:258

##  **Does Binding a Constant Reference to a Sub-Object of a Temporary Extend Its Lifetime? A Tale of GCC and Clang**

임시 하위 개체에 상수 참조 바인딩

표준 동작

상수 참조를 하위 개체에 바인딩할 때의 동작 임시는 C 표준에 의해 정의되며 컴파일러 공급업체에 따라 다릅니다.

GCC 및 Clang 차이점

  • GCC(버전 5.2.0): main에 printf를 입력하기 전에 임시 P2d 인스턴스를 삭제하고 다른 임시 double을 생성하여 값을 보존합니다.
  • Clang(버전 X): 임시 P2d 인스턴스의 수명을 x 참조의 수명으로 연장합니다. main.

설명

CWG 1651에 따르면 prvalue에 적용된 멤버 액세스 또는 아래 첨자 표현식의 결과는 xvalue로 처리되어야 합니다. 이는 임시의 하위 개체에 대한 참조를 바인딩해도 임시의 수명이 연장되어서는 안 된다는 것을 의미합니다.

그러나 제공된 예에서 두 컴파일러는 center().x를 prvalue로 처리합니다. GCC는 스칼라 하위 객체를 사용할 때 [dcl.init.ref]/(5.2.1.1)에서 다루지 않기 때문에 수명을 연장하지 않습니다. 따라서 임시 객체는 조기에 폐기될 수 있습니다.

반대로 Clang은 DR 1651에 대한 보류 중인 해결 방법을 구현했습니다. 이는 E1이 임시 표현식이고 E2가 비트 필드를 지정하지 않으면 E1이 .E2는 임시 표현입니다. center()는 이 정의에 따른 임시 표현이므로 [class.temporary] /5의 수정된 표현이 적용됩니다. 해당 임시 개체가 참조 수명 동안 지속된다는 것을 명시적으로 명시합니다.

따라서 Clang은 이 경우 임시 P2d 인스턴스의 수명을 연장하는 반면 GCC는 그렇지 않습니다.

결론

GCC와 Clang의 현재 동작은 제안된 C 표준 개정판이 채택되면 변경될 것으로 예상됩니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3